package gui // peerActionsGui.go implements pages to manage peer actions, such as blocking, liking, and hiding import "fyne.io/fyne/v2" import "fyne.io/fyne/v2/container" import "fyne.io/fyne/v2/layout" import "fyne.io/fyne/v2/theme" import "fyne.io/fyne/v2/widget" import "seekia/internal/desires/myLocalDesires" import "seekia/internal/desires/myMateDesires" import "seekia/internal/encoding" import "seekia/internal/helpers" import "seekia/internal/identity" import "seekia/internal/messaging/myChatFilters" import "seekia/internal/messaging/myChatMessages" import "seekia/internal/myBlockedUsers" import "seekia/internal/myContacts" import "seekia/internal/myIdentity" import "seekia/internal/myIgnoredUsers" import "seekia/internal/myLikedUsers" import "seekia/internal/myMatches" import "seekia/internal/mySettings" import "seekia/internal/network/appNetworkType/getAppNetworkType" import "seekia/internal/profiles/myLocalProfiles" import "seekia/internal/profiles/myProfileStatus" import "seekia/internal/profiles/viewableProfiles" import "slices" import "strings" import "errors" func setViewPeerActionsPage(window fyne.Window, userIdentityHash [16]byte, previousPage func()){ currentPage := func(){setViewPeerActionsPage(window, userIdentityHash, previousPage)} title := getPageTitleCentered("User Actions") backButton := getBackButtonCentered(previousPage) page := container.NewVBox(title, backButton, widget.NewSeparator()) userIdentityType, err := identity.GetIdentityTypeFromIdentityHash(userIdentityHash) if (err != nil) { userIdentityHashHex := encoding.EncodeBytesToHexString(userIdentityHash[:]) setErrorEncounteredPage(window, errors.New("setViewPeerActionsPage called with invalid userIdentityHash: " + userIdentityHashHex), previousPage) return } userIsBlocked, timeOfBlockingUnix, reasonExists, blockReason, err := myBlockedUsers.CheckIfUserIsBlocked(userIdentityHash) if (err != nil) { setErrorEncounteredPage(window, err, previousPage) return } if (userIsBlocked == true){ isBlockedText := getBoldLabelCentered("User Is Blocked") blockedAgoString, err := helpers.ConvertUnixTimeToTimeAgoTranslated(timeOfBlockingUnix, false) if (err != nil) { setErrorEncounteredPage(window, err, previousPage) return } blockedAgoLabel := getItalicLabelCentered("Blocked " + blockedAgoString + ".") page.Add(isBlockedText) page.Add(blockedAgoLabel) if (reasonExists == true){ blockedReasonLabel := getBoldLabelCentered("Reason:") page.Add(blockedReasonLabel) blockReasonTrimmed, changesOccurred, err := helpers.TrimAndFlattenString(blockReason, 20) if (err != nil) { setErrorEncounteredPage(window, err, previousPage) return } if (changesOccurred == false){ blockedReasonText := getLabelCentered(blockReason) page.Add(blockedReasonText) } else { blockedReasonText := widget.NewLabel(blockReasonTrimmed) viewReasonButton := widget.NewButtonWithIcon("", theme.VisibilityIcon(), func(){ setViewTextPage(window, "Viewing Block Reason", blockReason, false, currentPage) }) blockReasonRow := container.NewHBox(layout.NewSpacer(), blockedReasonText, viewReasonButton, layout.NewSpacer()) page.Add(blockReasonRow) } } unblockButton := getWidgetCentered(widget.NewButton("Unblock User", func(){ setConfirmUnblockUserPage(window, userIdentityHash, currentPage, currentPage) })) page.Add(unblockButton) page.Add(widget.NewSeparator()) } if (userIsBlocked == false && userIdentityType == "Mate"){ getButtonsWithIconsRow := func()(*fyne.Container, error){ getLikeOrUnlikeButtonWithIcon := func()(*fyne.Container, error){ userIsLiked, _, err := myLikedUsers.CheckIfUserIsLiked(userIdentityHash) if (err != nil) { return nil, err } if (userIsLiked == true){ unlikeIcon, err := getFyneImageIcon("Unlike") if (err != nil) { return nil, err } unlikeButton := widget.NewButton("Unlike", func(){ setConfirmUnlikeUserPage(window, userIdentityHash, currentPage, currentPage) }) unlikeButtonWithIcon := container.NewGridWithColumns(1, unlikeIcon, unlikeButton) return unlikeButtonWithIcon, nil } likeIcon, err := getFyneImageIcon("Like") if (err != nil) { return nil, err } likeButton := widget.NewButton("Like", func(){ setConfirmLikeUserPage(window, userIdentityHash, currentPage, currentPage) }) likeButtonWithIcon := container.NewGridWithColumns(1, likeIcon, likeButton) return likeButtonWithIcon, nil } likeOrUnlikeButtonWithIcon, err := getLikeOrUnlikeButtonWithIcon() if (err != nil) { return nil, err } getIgnoreOrUnignoreButtonWithIcon := func()(*fyne.Container, error){ userIsIgnored, _, _, _, err := myIgnoredUsers.CheckIfUserIsIgnored(userIdentityHash) if (err != nil) { return nil, err } if (userIsIgnored == true){ unignoreIcon := widget.NewIcon(theme.VisibilityIcon()) unignoreButton := widget.NewButton("Unignore", func(){ setConfirmUnignoreUserPage(window, userIdentityHash, currentPage, currentPage) }) unignoreButtonWithIcon := container.NewGridWithColumns(1, unignoreIcon, unignoreButton) return unignoreButtonWithIcon, nil } ignoreIcon := widget.NewIcon(theme.VisibilityOffIcon()) ignoreButton := widget.NewButton("Ignore", func(){ setConfirmIgnoreUserPage(window, userIdentityHash, currentPage, currentPage) }) ignoreButtonWithIcon := container.NewGridWithColumns(1, ignoreIcon, ignoreButton) return ignoreButtonWithIcon, nil } ignoreOrUnignoreButtonWithIcon, err := getIgnoreOrUnignoreButtonWithIcon() if (err != nil) { return nil, err } greetIcon, err := getFyneImageIcon("Greet") if (err != nil) { return nil, err } greetButton := widget.NewButton("Greet", func(){ setConfirmGreetOrRejectUserPage(window, "Greet", userIdentityHash, currentPage, currentPage) }) greetButtonWithIcon := container.NewGridWithColumns(1, greetIcon, greetButton) rejectIcon, err := getFyneImageIcon("Reject") if (err != nil) { return nil, err } rejectButton := widget.NewButton("Reject", func(){ setConfirmGreetOrRejectUserPage(window, "Reject", userIdentityHash, currentPage, currentPage) }) rejectButtonWithIcon := container.NewGridWithColumns(1, rejectIcon, rejectButton) buttonsWithIconsRow := getContainerCentered(container.NewGridWithRows(1, likeOrUnlikeButtonWithIcon, greetButtonWithIcon, ignoreOrUnignoreButtonWithIcon, rejectButtonWithIcon)) return buttonsWithIconsRow, nil } buttonsWithIconsRow, err := getButtonsWithIconsRow() if (err != nil){ setErrorEncounteredPage(window, err, previousPage) return } page.Add(buttonsWithIconsRow) page.Add(widget.NewSeparator()) } buttonsGrid := container.NewGridWithColumns(1) if (userIsBlocked == false){ contactExists, err := myContacts.CheckIfUserIsMyContact(userIdentityHash) if (err != nil) { setErrorEncounteredPage(window, err, previousPage) return } if (contactExists == true){ manageContactButton := widget.NewButton("Manage Contact", func(){ setManageContactPage(window, userIdentityHash, currentPage) }) buttonsGrid.Add(manageContactButton) } else { addContactButton := widget.NewButtonWithIcon("Add Contact", theme.ContentAddIcon(), func(){ setAddContactFromIdentityHashPage( window, userIdentityHash, currentPage, currentPage) }) buttonsGrid.Add(addContactButton) } blockButton := widget.NewButtonWithIcon("Block", theme.CancelIcon(), func(){ setConfirmBlockUserButton(window, userIdentityHash, currentPage, currentPage) }) buttonsGrid.Add(blockButton) if (userIdentityType != "Host"){ chatButton := widget.NewButtonWithIcon("Chat", theme.MailComposeIcon(), func(){ setViewAConversationPage(window, userIdentityHash, true, currentPage) }) buttonsGrid.Add(chatButton) } } viewProfileButton := widget.NewButtonWithIcon("View Profile", theme.VisibilityIcon(), func(){ setViewPeerProfilePageFromIdentityHash(window, userIdentityHash, currentPage) }) buttonsGrid.Add(viewProfileButton) viewIdentityHashButton := widget.NewButtonWithIcon("View Identity Hash", theme.VisibilityIcon(), func(){ setViewIdentityHashPage(window, userIdentityHash, currentPage) }) buttonsGrid.Add(viewIdentityHashButton) buttonsGridCentered := getContainerCentered(buttonsGrid) page.Add(buttonsGridCentered) setPageContent(page, window) } func setConfirmBlockUserButton(window fyne.Window, userIdentityHash [16]byte, previousPage func(), nextPage func()){ setLoadingScreen(window, "Block User", "Loading Block User page...") title := getPageTitleCentered("Confirm Block User") backButton := getBackButtonCentered(previousPage) description1 := getBoldLabelCentered("Block this user?") description2 := getLabelCentered("The user will not be notified.") description3 := getLabelCentered("To notify the user, you must Reject them first.") page := container.NewVBox(title, backButton, widget.NewSeparator(), description1, description2, description3, widget.NewSeparator()) getTotalNumberOfConversationMessages := func()(int, error){ // We see how many messages exist on both network types. numberOfConversationMessages_Network1, err := myChatMessages.GetNumberOfMyConversationMessages(userIdentityHash, 1) if (err != nil) { return 0, err } numberOfConversationMessages_Network2, err := myChatMessages.GetNumberOfMyConversationMessages(userIdentityHash, 2) if (err != nil) { return 0, err } result := numberOfConversationMessages_Network1 + numberOfConversationMessages_Network2 return result, nil } numberOfConversationMessages, err := getTotalNumberOfConversationMessages() if (err != nil){ setErrorEncounteredPage(window, err, previousPage) return } if (numberOfConversationMessages != 0){ numberOfConversationMessagesString := helpers.ConvertIntToString(numberOfConversationMessages) description4 := getLabelCentered("This will delete your conversation history.") description5 := getBoldLabelCentered("You have " + numberOfConversationMessagesString + " conversation messages.") page.Add(description4) page.Add(description5) page.Add(widget.NewSeparator()) } enterReasonText := getLabelCentered("Enter reason (optional):") page.Add(enterReasonText) enterReasonDescriptionA := getLabelCentered("This reason is stored privately and is not shared.") enterReasonDescriptionB := getLabelCentered("It can help you remember why you blocked a user.") enterReasonDescriptions := container.NewVBox(enterReasonDescriptionA, enterReasonDescriptionB) enterReasonTextEntry := widget.NewEntry() enterReasonTextEntry.SetPlaceHolder("Enter reason.") enterReasonEntryBoxed := getWidgetBoxed(enterReasonTextEntry) enterReasonEntryWithDescriptions := getContainerCentered(container.NewGridWithColumns(1, enterReasonDescriptions, enterReasonEntryBoxed)) page.Add(enterReasonEntryWithDescriptions) page.Add(widget.NewSeparator()) blockUserFunction := func()error{ reason := enterReasonTextEntry.Text if (reason == ""){ err := myBlockedUsers.BlockUser(userIdentityHash, false, "") if (err != nil) { return err } } else { err := myBlockedUsers.BlockUser(userIdentityHash, true, reason) if (err != nil) { return err } } userIdentityType, err := identity.GetIdentityTypeFromIdentityHash(userIdentityHash) if (err != nil) { return err } if (userIdentityType != "Host"){ //TODO: Add delete peer chat keys, secret inboxes, and device identifier err = myChatMessages.DeleteAllPeerConversationMessages(userIdentityHash) if (err != nil) { return err } err := mySettings.SetSetting(userIdentityType + "ChatConversationsGeneratedStatus", "No") if (err != nil) { return err } } if (userIdentityType == "Mate"){ appNetworkType, err := getAppNetworkType.GetAppNetworkType() if (err != nil) { return err } myMatchesReady, myMatchesList, err := myMatches.GetMyMatchesList(appNetworkType) if (err != nil) { return err } if (myMatchesReady == false){ err = mySettings.SetSetting("MatchesNeedRefreshYesNo", "Yes") if (err != nil) { return err } } else { userIsAMatch := slices.Contains(myMatchesList, userIdentityHash) if (userIsAMatch == true){ err = mySettings.SetSetting("MatchesNeedRefreshYesNo", "Yes") if (err != nil) { return err } } } } return nil } confirmButton := getWidgetCentered(widget.NewButtonWithIcon("Block User", theme.ConfirmIcon(), func(){ setLoadingScreen(window, "Block User", "Blocking User...") err := blockUserFunction() if (err != nil){ setErrorEncounteredPage(window, err, previousPage) return } nextPage() })) page.Add(confirmButton) setPageContent(page, window) } func setConfirmUnblockUserPage(window fyne.Window, userIdentityHash [16]byte, previousPage func(), nextPage func()){ setLoadingScreen(window, "Unblock User", "Loading Unblock User page...") currentPage := func(){setConfirmUnblockUserPage(window, userIdentityHash, previousPage, nextPage)} title := getPageTitleCentered("Confirm Unblock User") backButton := getBackButtonCentered(previousPage) description1 := getBoldLabelCentered("Unblock this user?") description2 := getLabelCentered("They will not be notified.") userIsBlocked, timeOfBlockingUnix, reasonExists, blockReason, err := myBlockedUsers.CheckIfUserIsBlocked(userIdentityHash) if (err != nil) { setErrorEncounteredPage(window, err, previousPage) return } if (userIsBlocked == false){ setErrorEncounteredPage(window, errors.New("setConfirmUnblockUserPage visited when user is not blocked."), previousPage) return } blockedAgoString, err := helpers.ConvertUnixTimeToTimeAgoTranslated(timeOfBlockingUnix, false) if (err != nil) { setErrorEncounteredPage(window, err, previousPage) return } blockedAgoTimeLabel := getItalicLabelCentered("Blocked " + blockedAgoString + ".") page := container.NewVBox(title, backButton, widget.NewSeparator(), description1, description2, blockedAgoTimeLabel) if (reasonExists == true){ page.Add(widget.NewSeparator()) blockReasonText := getLabelCentered("Reason for blocking:") page.Add(blockReasonText) blockReasonTrimmed, changesOccurred, err := helpers.TrimAndFlattenString(blockReason, 20) if (err != nil) { setErrorEncounteredPage(window, err, previousPage) return } if (changesOccurred == false){ blockedReasonText := getBoldLabelCentered(blockReason) page.Add(blockedReasonText) } else { blockedReasonText := getBoldLabel(blockReasonTrimmed) viewReasonButton := widget.NewButtonWithIcon("", theme.VisibilityIcon(), func(){ setViewTextPage(window, "Viewing Block Reason", blockReason, false, currentPage) }) blockReasonRow := container.NewHBox(layout.NewSpacer(), blockedReasonText, viewReasonButton, layout.NewSpacer()) page.Add(blockReasonRow) } page.Add(widget.NewSeparator()) } unblockUserFunction := func()error{ err := myBlockedUsers.UnblockUser(userIdentityHash) if (err != nil) { return err } userIdentityType, err := identity.GetIdentityTypeFromIdentityHash(userIdentityHash) if (err != nil) { return err } if (userIdentityType != "Host"){ // If the blocked user sent us any messages, then there may be new messages available // These are messages that we would have skipped when the sender was blocked err := mySettings.SetSetting(userIdentityType + "ChatConversationsNeedRefreshYesNo", "Yes") if (err != nil) { return err } } if (userIdentityType == "Mate"){ // Now we check if the user would have been a match if they were not blocked // If yes, we know that matches need to be refreshed appNetworkType, err := getAppNetworkType.GetAppNetworkType() if (err != nil) { return err } profileExists, _, getAnyUserAttributeFunction, err := viewableProfiles.GetRetrieveAnyNewestViewableUserProfileAttributeFunction(userIdentityHash, appNetworkType, true, false, false) if (err != nil) { return err } if (profileExists == true) { passesMyDesires, err := myMateDesires.CheckIfMateProfilePassesAllMyDesires(false, "", getAnyUserAttributeFunction) if (err != nil) { return err } if (passesMyDesires == true){ err = mySettings.SetSetting("MatchesNeedRefreshYesNo", "Yes") if (err != nil) { return err } } } } return nil } confirmButton := getWidgetCentered(widget.NewButtonWithIcon("Unblock User", theme.ConfirmIcon(), func(){ setLoadingScreen(window, "Unblock User", "Unblocking User...") err := unblockUserFunction() if (err != nil){ setErrorEncounteredPage(window, err, previousPage) return } nextPage() })) page.Add(confirmButton) setPageContent(page, window) } func setConfirmIgnoreUserPage(window fyne.Window, userIdentityHash [16]byte, previousPage func(), nextPage func()){ userIdentityType, err := identity.GetIdentityTypeFromIdentityHash(userIdentityHash) if (err != nil) { setErrorEncounteredPage(window, err, previousPage) return } if (userIdentityType != "Mate"){ setErrorEncounteredPage(window, errors.New("Trying to ignore non-mate user."), previousPage) return } title := getPageTitleCentered("Confirm Ignore User") backButton := getBackButtonCentered(previousPage) description1 := getBoldLabelCentered("Ignore user?") description2 := getLabelCentered("The user will not show up in your matches/chat conversations.") description3 := getLabelCentered("You can change this by enabling Show Ignored Users in your desires/chat filters.") description4 := getLabelCentered("The user will not be notified.") description5 := getLabelCentered("To notify them, Reject them first.") enterReasonText := getBoldLabelCentered("Enter reason (optional):") enterReasonDescriptionA := getLabelCentered("This reason is stored privately and is not shared.") enterReasonDescriptionB := getLabelCentered("It can help you remember why you hid a user.") enterReasonDescriptions := container.NewVBox(enterReasonDescriptionA, enterReasonDescriptionB) enterReasonTextEntry := widget.NewEntry() enterReasonTextEntry.SetPlaceHolder("Enter reason.") enterReasonEntryBoxed := getWidgetBoxed(enterReasonTextEntry) enterReasonEntryWithDescriptions := getContainerCentered(container.NewGridWithColumns(1, enterReasonDescriptions, enterReasonEntryBoxed)) ignoreUserFunction := func()error{ reason := enterReasonTextEntry.Text if (reason == ""){ err := myIgnoredUsers.IgnoreUser(userIdentityHash, false, "") if (err != nil) { return err } } else { err := myIgnoredUsers.IgnoreUser(userIdentityHash, true, reason) if (err != nil) { return err } } hideIgnoredUsersBool, err := myChatFilters.GetChatFilterOnOffStatus("Mate", "HideIgnoredUsers") if (err != nil) { return err } if (hideIgnoredUsersBool == true){ err := mySettings.SetSetting("MateChatConversationsNeedRefreshYesNo", "Yes") if (err != nil) { return err } } getShowIgnoredMatchesBool := func()(bool, error){ //TODO return false, nil } showIgnoredMatchesBool, err := getShowIgnoredMatchesBool() if (err != nil) { return err } if (showIgnoredMatchesBool == false){ appNetworkType, err := getAppNetworkType.GetAppNetworkType() if (err != nil) { return err } myMatchesReady, myMatchesList, err := myMatches.GetMyMatchesList(appNetworkType) if (err != nil) { return err } if (myMatchesReady == false){ err = mySettings.SetSetting("MatchesNeedRefreshYesNo", "Yes") if (err != nil) { return err } } else { userIsAMatch := slices.Contains(myMatchesList, userIdentityHash) if (userIsAMatch == true){ err = mySettings.SetSetting("MatchesNeedRefreshYesNo", "Yes") if (err != nil) { return err } } } } return nil } confirmButton := getWidgetCentered(widget.NewButtonWithIcon("Ignore User", theme.ConfirmIcon(), func(){ setLoadingScreen(window, "Ignore User", "Hiding User...") err := ignoreUserFunction() if (err != nil){ setErrorEncounteredPage(window, err, previousPage) return } nextPage() })) page := container.NewVBox(title, backButton, widget.NewSeparator(), description1, description2, description3, description4, description5, widget.NewSeparator(), enterReasonText, enterReasonEntryWithDescriptions, widget.NewSeparator(), confirmButton) setPageContent(page, window) } func setConfirmUnignoreUserPage(window fyne.Window, userIdentityHash [16]byte, previousPage func(), nextPage func()){ userIdentityType, err := identity.GetIdentityTypeFromIdentityHash(userIdentityHash) if (err != nil) { setErrorEncounteredPage(window, err, previousPage) return } if (userIdentityType != "Mate"){ setErrorEncounteredPage(window, errors.New("setConfirmUnignoreUserPage called with non-mate user."), previousPage) return } setLoadingScreen(window, "Unignore User", "Loading Unignore User page...") currentPage := func(){setConfirmUnignoreUserPage(window, userIdentityHash, previousPage, nextPage)} title := getPageTitleCentered("Confirm Unignore User") backButton := getBackButtonCentered(previousPage) description1 := getBoldLabelCentered("Unignore this user?") description2 := getLabelCentered("They will not be notified.") userIsIgnored, timeOfHidingUnix, reasonExists, ignoreReason, err := myIgnoredUsers.CheckIfUserIsIgnored(userIdentityHash) if (err != nil) { setErrorEncounteredPage(window, err, previousPage) return } if (userIsIgnored == false){ setErrorEncounteredPage(window, errors.New("setConfirmUnignoreUserPage visited when user is not ignored."), previousPage) return } ignoredAgoString, err := helpers.ConvertUnixTimeToTimeAgoTranslated(timeOfHidingUnix, false) if (err != nil) { setErrorEncounteredPage(window, err, previousPage) return } ignoredAgoTimeLabel := getItalicLabelCentered("Ignored " + ignoredAgoString + ".") page := container.NewVBox(title, backButton, widget.NewSeparator(), description1, description2, ignoredAgoTimeLabel) if (reasonExists == true){ page.Add(widget.NewSeparator()) ignoreReasonText := getLabelCentered("Reason for hiding:") page.Add(ignoreReasonText) ignoreReasonTrimmed, changesOccurred, err := helpers.TrimAndFlattenString(ignoreReason, 20) if (err != nil) { setErrorEncounteredPage(window, err, previousPage) return } if (changesOccurred == false){ ignoreReasonText := getBoldLabelCentered(ignoreReason) page.Add(ignoreReasonText) } else { ignoreReasonText := getBoldLabel(ignoreReasonTrimmed) viewReasonButton := widget.NewButtonWithIcon("", theme.VisibilityIcon(), func(){ setViewTextPage(window, "Viewing Ignore Reason", ignoreReason, false, currentPage) }) ignoreReasonRow := container.NewHBox(layout.NewSpacer(), ignoreReasonText, viewReasonButton, layout.NewSpacer()) page.Add(ignoreReasonRow) } page.Add(widget.NewSeparator()) } unignoreUserFunction := func()error{ err := myIgnoredUsers.UnignoreUser(userIdentityHash) if (err != nil) { return err } hideIgnoredUsersBool, err := myChatFilters.GetChatFilterOnOffStatus("Mate", "HideIgnoredUsers") if (err != nil) { return err } if (hideIgnoredUsersBool == true){ err := mySettings.SetSetting("MateChatConversationsNeedRefreshYesNo", "Yes") if (err != nil) { return err } } getShowIgnoredMatchesBool := func()(bool, error){ //TODO return false, nil } showIgnoredMatchesBool, err := getShowIgnoredMatchesBool() if (err != nil) { return err } if (showIgnoredMatchesBool == false){ // Now we check if user would have been a match if they were not ignored // If yes, matches need to be refreshed appNetworkType, err := getAppNetworkType.GetAppNetworkType() if (err != nil) { return err } profileExists, _, getAnyUserAttributeFunction, err := viewableProfiles.GetRetrieveAnyNewestViewableUserProfileAttributeFunction(userIdentityHash, appNetworkType, true, false, false) if (err != nil) { return err } if (profileExists == true) { passesMyDesires, err := myMateDesires.CheckIfMateProfilePassesAllMyDesires(false, "", getAnyUserAttributeFunction) if (err != nil) { return err } if (passesMyDesires == true){ err = mySettings.SetSetting("MatchesNeedRefreshYesNo", "Yes") if (err != nil) { return err } } } } return nil } confirmButton := getWidgetCentered(widget.NewButtonWithIcon("Unignore User", theme.ConfirmIcon(), func(){ setLoadingScreen(window, "Unignore User", "Unhiding User...") err := unignoreUserFunction() if (err != nil){ setErrorEncounteredPage(window, err, previousPage) return } nextPage() })) page.Add(confirmButton) setPageContent(page, window) } func setConfirmLikeUserPage(window fyne.Window, userIdentityHash [16]byte, previousPage func(), nextPage func()){ userIdentityType, err := identity.GetIdentityTypeFromIdentityHash(userIdentityHash) if (err != nil) { userIdentityHashHex := encoding.EncodeBytesToHexString(userIdentityHash[:]) setErrorEncounteredPage(window, errors.New("setConfirmLikeUserPage called with invalid identityHash: " + userIdentityHashHex), previousPage) return } if (userIdentityType != "Mate"){ setErrorEncounteredPage(window, errors.New("setConfirmLikeUserPage called with non-mate identity."), previousPage) return } title := getPageTitleCentered("Confirm Like User") backButton := getBackButtonCentered(previousPage) description1 := getBoldLabelCentered("Like user?") description2 := getLabelCentered("The user will be saved in your liked users.") description3 := getLabelCentered("They will not be notified.") description4 := getLabelCentered("To notify them, Greet or message them.") likeUserFunction := func()error{ err := myLikedUsers.LikeUser(userIdentityHash) if (err != nil) { return err } onlyShowLikedUsersBool, err := myChatFilters.GetChatFilterOnOffStatus("Mate", "OnlyShowLikedUsers") if (err != nil) { return err } if (onlyShowLikedUsersBool == true){ err := mySettings.SetSetting("MateChatConversationsNeedRefreshYesNo", "Yes") if (err != nil) { return err } } getOnlyShowLikedMatchesBool := func()(bool, error){ exists, onlyShowLikedMatches, err := myLocalDesires.GetDesire("OnlyShowLikedMatches") if (err != nil) { return false, err } if (exists == true && onlyShowLikedMatches == "Yes"){ return true, nil } return false, nil } onlyShowLikedMatchesBool, err := getOnlyShowLikedMatchesBool() if (err != nil) { return err } if (onlyShowLikedMatchesBool == true){ // Now we check if user is now a match, now that they are liked // If yes, matches need to be refreshed appNetworkType, err := getAppNetworkType.GetAppNetworkType() if (err != nil) { return err } profileExists, _, getAnyUserAttributeFunction, err := viewableProfiles.GetRetrieveAnyNewestViewableUserProfileAttributeFunction(userIdentityHash, appNetworkType, true, false, false) if (err != nil) { return err } if (profileExists == true) { passesMyDesires, err := myMateDesires.CheckIfMateProfilePassesAllMyDesires(false, "", getAnyUserAttributeFunction) if (err != nil) { return err } if (passesMyDesires == true){ err = mySettings.SetSetting("MatchesNeedRefreshYesNo", "Yes") if (err != nil) { return err } } } } return nil } confirmButton := getWidgetCentered(widget.NewButtonWithIcon("Like User", theme.ConfirmIcon(), func(){ setLoadingScreen(window, "Like User", "Like User...") err := likeUserFunction() if (err != nil){ setErrorEncounteredPage(window, err, previousPage) return } nextPage() })) page := container.NewVBox(title, backButton, widget.NewSeparator(), description1, description2, description3, description4, widget.NewSeparator(), confirmButton) setPageContent(page, window) } func setConfirmUnlikeUserPage(window fyne.Window, userIdentityHash [16]byte, previousPage func(), nextPage func()){ userIdentityType, err := identity.GetIdentityTypeFromIdentityHash(userIdentityHash) if (err != nil) { setErrorEncounteredPage(window, err, previousPage) return } if (userIdentityType != "Mate"){ setErrorEncounteredPage(window, errors.New("setConfirmUnlikeUserPage called with non-mate identity."), previousPage) return } setLoadingScreen(window, "Unlike User", "Loading Unlike User page...") title := getPageTitleCentered("Confirm Unlike User") backButton := getBackButtonCentered(previousPage) description1 := getBoldLabelCentered("Unlike user?") description2 := getLabelCentered("The user will be removed from your likes.") description3 := getLabelCentered("They will not be notified.") userIsLiked, timeOfLikingUnix, err := myLikedUsers.CheckIfUserIsLiked(userIdentityHash) if (err != nil) { setErrorEncounteredPage(window, err, previousPage) return } if (userIsLiked == false){ setErrorEncounteredPage(window, errors.New("setConfirmUnlikeUserPage visited when user is not liked."), previousPage) return } likedAgoString, err := helpers.ConvertUnixTimeToTimeAgoTranslated(timeOfLikingUnix, false) if (err != nil) { setErrorEncounteredPage(window, err, previousPage) return } likedAgoLabel := getItalicLabelCentered("Liked " + likedAgoString + ".") unlikeUserFunction := func()error{ err := myLikedUsers.UnlikeUser(userIdentityHash) if (err != nil) { return err } onlyShowLikedUsersBool, err := myChatFilters.GetChatFilterOnOffStatus("Mate", "OnlyShowLikedUsers") if (err != nil) { return err } if (onlyShowLikedUsersBool == true){ err := mySettings.SetSetting("MateChatConversationsNeedRefreshYesNo", "Yes") if (err != nil) { return err } } getOnlyShowLikedMatchesBool := func()(bool, error){ exists, onlyShowLikedMatches, err := myLocalDesires.GetDesire("OnlyShowLikedMatches") if (err != nil) { return false, err } if (exists == true && onlyShowLikedMatches == "Yes"){ return true, nil } return false, nil } onlyShowLikedMatchesBool, err := getOnlyShowLikedMatchesBool() if (err != nil) { return err } if (onlyShowLikedMatchesBool == true){ // We see if the user will no longer be a match. // If so, we make sure that matchesNeedRefresh status is updated appNetworkType, err := getAppNetworkType.GetAppNetworkType() if (err != nil) { return err } myMatchesReady, myMatchesList, err := myMatches.GetMyMatchesList(appNetworkType) if (err != nil) { return err } if (myMatchesReady == false){ err = mySettings.SetSetting("MatchesNeedRefreshYesNo", "Yes") if (err != nil) { return err } } else { userIsAMatch := slices.Contains(myMatchesList, userIdentityHash) if (userIsAMatch == true){ err = mySettings.SetSetting("MatchesNeedRefreshYesNo", "Yes") if (err != nil) { return err } } } } return nil } confirmButton := getWidgetCentered(widget.NewButtonWithIcon("Unlike User", theme.ConfirmIcon(), func(){ setLoadingScreen(window, "Unlike User", "Unliking User...") err := unlikeUserFunction() if (err != nil){ setErrorEncounteredPage(window, err, previousPage) return } nextPage() })) page := container.NewVBox(title, backButton, widget.NewSeparator(), description1, description2, description3, likedAgoLabel, confirmButton) setPageContent(page, window) } func setConfirmGreetOrRejectUserPage(window fyne.Window, greetOrReject string, userIdentityHash [16]byte, previousPage func(), afterSendPage func()){ currentPage := func(){setConfirmGreetOrRejectUserPage(window, greetOrReject, userIdentityHash, previousPage, afterSendPage)} if (greetOrReject != "Greet" && greetOrReject != "Reject"){ setErrorEncounteredPage(window, errors.New("setConfirmGreetOrRejectUserPage called with invalid greetOrReject: " + greetOrReject), previousPage) return } userIdentityType, err := identity.GetIdentityTypeFromIdentityHash(userIdentityHash) if (err != nil){ setErrorEncounteredPage(window, err, previousPage) return } if (userIdentityType != "Mate"){ setErrorEncounteredPage(window, errors.New("Trying to greet/reject a non-mate user."), previousPage) return } title := getPageTitleCentered("Confirm " + greetOrReject + " User") backButton := getBackButtonCentered(previousPage) greetOrRejectLowercase := strings.ToLower(greetOrReject) myIdentityExists, myIdentityHash, err := myIdentity.GetMyIdentityHash("Mate") if (err != nil) { setErrorEncounteredPage(window, err, previousPage) return } if (myIdentityExists == false){ description1 := getBoldLabelCentered("Your Mate identity does not exist.") description2 := getLabelCentered("A " + greetOrRejectLowercase + " is a message sent to another user.") description3 := getLabelCentered("You cannot " + greetOrRejectLowercase + " a user without a mate identity.") description4 := getLabelCentered("Create your Mate identity?") createIdentityButton := getWidgetCentered(widget.NewButtonWithIcon("Create Mate Identity", theme.NavigateNextIcon(), func(){ setChooseNewIdentityHashPage(window, "Mate", currentPage, currentPage) })) page := container.NewVBox(title, backButton, widget.NewSeparator(), description1, description2, description3, description4, createIdentityButton) setPageContent(page, window) return } exists, iAmDisabled, err := myLocalProfiles.GetProfileData("Mate", "Disabled") if (err != nil) { setErrorEncounteredPage(window, err, previousPage) return } if (exists == true && iAmDisabled == "Yes"){ description1 := getBoldLabelCentered("Your Mate profile is disabled.") description2 := getLabelCentered("A " + greetOrRejectLowercase + " is a message sent to another user.") description3 := getLabelCentered("You cannot " + greetOrRejectLowercase + " users with a disabled profile.") description4 := getLabelCentered("Enable your profile on the Broadcast page to continue.") visitBroadcastPageButton := getWidgetCentered(widget.NewButtonWithIcon("Visit Broadcast Page", theme.NavigateNextIcon(), func(){ setBroadcastPage(window, "Mate", currentPage) })) page := container.NewVBox(title, backButton, widget.NewSeparator(), description1, description2, description3, description4, visitBroadcastPageButton) setPageContent(page, window) return } appNetworkType, err := getAppNetworkType.GetAppNetworkType() if (err != nil) { setErrorEncounteredPage(window, err, previousPage) return } myIdentityFound, myProfileIsActiveStatus, err := myProfileStatus.GetMyProfileIsActiveStatus(myIdentityHash, appNetworkType) if (err != nil) { setErrorEncounteredPage(window, err, previousPage) return } if (myIdentityFound == false) { setErrorEncounteredPage(window, errors.New("My identity not found after being found already."), previousPage) return } if (myProfileIsActiveStatus == false){ description1 := getBoldLabelCentered("Your Mate profile is not active.") description2 := getLabelCentered("A " + greetOrRejectLowercase + " is a message sent to another user.") description3 := getLabelCentered("You must broadcast your Mate profile to " + greetOrRejectLowercase + " users.") description4 := getLabelCentered("Broadcast your Mate profile on the Broadcast page.") broadcastPageButton := getWidgetCentered(widget.NewButtonWithIcon("Visit Broadcast Page", theme.NavigateNextIcon(), func(){ setBroadcastPage(window, "Mate", currentPage) })) page := container.NewVBox(title, backButton, widget.NewSeparator(), description1, description2, description3, description4, broadcastPageButton) setPageContent(page, window) return } description1 := getBoldLabelCentered(greetOrReject + " User?") description2 := getLabelCentered("This will send the user a " + greetOrReject + " message.") getDescription3Text := func()string{ if (greetOrReject == "Greet"){ result := translate("This is a way of signaling interest in the user.") return result } // greetOrReject = "Reject" result := translate("This is a way of telling users you are not interested in them.") return result } description3Text := getDescription3Text() description3Label := widget.NewLabel(description3Text) helpButton := widget.NewButtonWithIcon("", theme.QuestionIcon(), func(){ setGreetAndRejectExplainerPage(window, currentPage) }) description3Row := container.NewHBox(layout.NewSpacer(), description3Label, helpButton, layout.NewSpacer()) description4 := getLabelCentered("You will pay for the message on the next page.") page := container.NewVBox(title, backButton, widget.NewSeparator(), description1, description2, description3Row, description4, widget.NewSeparator()) //Outputs: // -bool: Section is needed // -*fyne.Container: Greet or reject status section // -error getCurrentGreetOrRejectStatusSection := func()(bool, *fyne.Container, error){ myIdentityFound, conversationFound, _, _, iHaveContactedThem, iHaveRejectedThem, timeOfMyMostRecentGreetOrReject, theyHaveContactedMe, theyHaveRejectedMe, timeOfTheirMostRecentGreetOrReject, err := myChatMessages.GetMyConversationInfoAndSortedMessagesList(myIdentityHash, userIdentityHash, appNetworkType) if (err != nil) { return false, nil, err } if (myIdentityFound == false){ return false, nil, errors.New("My identity not found after being found already.") } if (conversationFound == false){ return false, nil, nil } if (iHaveContactedThem == false && theyHaveContactedMe == false){ return false, nil, nil } statusSection := container.NewVBox() if (iHaveContactedThem == true){ timeAgoText, err := helpers.ConvertUnixTimeToTimeAgoTranslated(timeOfMyMostRecentGreetOrReject, false) if (err != nil) { return false, nil, err } if (iHaveRejectedThem == true){ greetOrRejectStatus := getBoldLabelCentered("You rejected this user " + timeAgoText + ".") statusSection.Add(greetOrRejectStatus) } else { greetOrRejectStatus := getBoldLabelCentered("You greeted this user " + timeAgoText + ".") statusSection.Add(greetOrRejectStatus) } } if (theyHaveContactedMe == true){ timeAgoText, err := helpers.ConvertUnixTimeToTimeAgoTranslated(timeOfTheirMostRecentGreetOrReject, false) if (err != nil) { return false, nil, err } if (theyHaveRejectedMe == true){ greetOrRejectStatus := getBoldLabelCentered("This user rejected you " + timeAgoText + ".") statusSection.Add(greetOrRejectStatus) } else { greetOrRejectStatus := getBoldLabelCentered("This user greeted you " + timeAgoText + ".") statusSection.Add(greetOrRejectStatus) } } return true, statusSection, nil } greetOrRejectStatusSectionNeeded, greetOrRejectStatusSection, err := getCurrentGreetOrRejectStatusSection() if (err != nil){ setErrorEncounteredPage(window, err, previousPage) return } if (greetOrRejectStatusSectionNeeded == true){ page.Add(greetOrRejectStatusSection) } greetOrRejectButton := getWidgetCentered(widget.NewButtonWithIcon(greetOrReject, theme.ConfirmIcon(), func(){ getMessageCommunication := func()string{ if (greetOrReject == "Greet"){ return ">!>Greet" } return ">!>Reject" } messageCommunication := getMessageCommunication() setFundAndSendChatMessagePage(window, myIdentityHash, userIdentityHash, messageCommunication, false, currentPage, afterSendPage) })) page.Add(greetOrRejectButton) setPageContent(page, window) }