@@ -26,6 +26,7 @@ import Subscription
26
26
import os. log
27
27
import Freemium
28
28
import DataBrokerProtection
29
+ import SwiftUI
29
30
30
31
protocol OptionsButtonMenuDelegate : AnyObject {
31
32
@@ -65,7 +66,7 @@ final class MoreOptionsMenu: NSMenu, NSMenuDelegate {
65
66
private let freemiumDBPFeature : FreemiumDBPFeature
66
67
private let freemiumDBPPresenter : FreemiumDBPPresenter
67
68
private let appearancePreferences : AppearancePreferences
68
- private let dockCustomizer : DockCustomization
69
+ private var dockCustomizer : DockCustomization ?
69
70
private let defaultBrowserPreferences : DefaultBrowserPreferences
70
71
71
72
private let notificationCenter : NotificationCenter
@@ -94,7 +95,7 @@ final class MoreOptionsMenu: NSMenu, NSMenuDelegate {
94
95
freemiumDBPFeature: FreemiumDBPFeature ,
95
96
freemiumDBPPresenter: FreemiumDBPPresenter = DefaultFreemiumDBPPresenter ( ) ,
96
97
appearancePreferences: AppearancePreferences = . shared,
97
- dockCustomizer: DockCustomization = DockCustomizer ( ) ,
98
+ dockCustomizer: DockCustomization ? = nil ,
98
99
defaultBrowserPreferences: DefaultBrowserPreferences = . shared,
99
100
notificationCenter: NotificationCenter = . default,
100
101
freemiumDBPExperimentPixelHandler: EventMapping < FreemiumDBPExperimentPixel > = FreemiumDBPExperimentPixelHandler ( ) ,
@@ -153,12 +154,28 @@ final class MoreOptionsMenu: NSMenu, NSMenuDelegate {
153
154
154
155
#endif // FEEDBACK
155
156
156
- #if !APPSTORE
157
- if !dockCustomizer. isAddedToDock {
158
- let addToDockMenuItem = NSMenuItem ( title: UserText . addDuckDuckGoToDock, action: #selector( addToDock ( _: ) ) )
159
- . targetting ( self )
160
- . withImage ( . addToDockMenuItem)
161
- addItem ( addToDockMenuItem)
157
+ #if SPARKLE
158
+ if let dockCustomizer = self . dockCustomizer {
159
+ if dockCustomizer. isAddedToDock == false {
160
+ if dockCustomizer. wasFeatureShownFromMoreOptionsMenu {
161
+ let addToDockMenuItem = NSMenuItem ( title: UserText . addDuckDuckGoToDock, action: #selector( addToDock ( _: ) ) )
162
+ . targetting ( self )
163
+ . withImage ( . addToDockMenuItem)
164
+ addItem ( addToDockMenuItem)
165
+ } else {
166
+ let addToDockMenuItem = NSMenuItem ( action: #selector( addToDock ( _: ) ) )
167
+ . targetting ( self )
168
+ addToDockMenuItem. view = createMenuItemWithFeatureIndicator (
169
+ title: UserText . addDuckDuckGoToDock,
170
+ image: . addToDockMenuItem) {
171
+ if let target = addToDockMenuItem. target {
172
+ _ = target. perform ( addToDockMenuItem. action, with: addToDockMenuItem)
173
+ // TODO: Need to close the menu when this happens
174
+ }
175
+ }
176
+ addItem ( addToDockMenuItem)
177
+ }
178
+ }
162
179
}
163
180
#endif
164
181
if !defaultBrowserPreferences. isDefault {
@@ -199,6 +216,16 @@ final class MoreOptionsMenu: NSMenu, NSMenuDelegate {
199
216
addItem ( preferencesItem)
200
217
}
201
218
219
+ private func createMenuItemWithFeatureIndicator( title: String , image: NSImage , onTap: @escaping ( ) -> Void ) -> NSView {
220
+ let menuItem = MenuItemWithNotificationDot ( leftImage: image, title: title, onTapMenuItem: onTap)
221
+
222
+ let hostingView = NSHostingView ( rootView: menuItem)
223
+ hostingView. frame = NSRect ( x: 0 , y: 0 , width: size. width, height: 22 )
224
+ hostingView. autoresizingMask = [ . width, . height]
225
+
226
+ return hostingView
227
+ }
228
+
202
229
@objc func openDataBrokerProtection( _ sender: NSMenuItem ) {
203
230
actionDelegate? . optionsButtonMenuRequestedDataBrokerProtection ( self )
204
231
}
@@ -210,7 +237,7 @@ final class MoreOptionsMenu: NSMenu, NSMenuDelegate {
210
237
@MainActor
211
238
@objc func addToDock( _ sender: NSMenuItem ) {
212
239
PixelKit . fire ( GeneralPixel . userAddedToDockFromMoreOptionsMenu)
213
- dockCustomizer. addToDock ( )
240
+ dockCustomizer? . addToDock ( )
214
241
}
215
242
216
243
@MainActor
@@ -530,6 +557,10 @@ final class MoreOptionsMenu: NSMenu, NSMenuDelegate {
530
557
}
531
558
#endif
532
559
}
560
+
561
+ func menuDidClose( _ menu: NSMenu ) {
562
+ dockCustomizer? . wasFeatureShownFromMoreOptionsMenu = true
563
+ }
533
564
}
534
565
535
566
final class EmailOptionsButtonSubMenu : NSMenu {
0 commit comments