1/* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4
5"use strict";
6
7var EXPORTED_SYMBOLS = ["AboutPocketParent"];
8ChromeUtils.defineModuleGetter(
9  this,
10  "pktApi",
11  "chrome://pocket/content/pktApi.jsm"
12);
13
14ChromeUtils.defineModuleGetter(
15  this,
16  "SaveToPocket",
17  "chrome://pocket/content/SaveToPocket.jsm"
18);
19
20class AboutPocketParent extends JSWindowActorParent {
21  sendResponseMessageToPanel(messageId, payload) {
22    this.sendAsyncMessage(`${messageId}_response`, payload);
23  }
24
25  isPanalAvailable() {
26    return !!this.manager && !this.manager.isClosed;
27  }
28
29  async receiveMessage(message) {
30    switch (message.name) {
31      case "PKT_show_signup": {
32        this.browsingContext.topChromeWindow?.pktUI.onShowSignup();
33        break;
34      }
35      case "PKT_show_saved": {
36        this.browsingContext.topChromeWindow?.pktUI.onShowSaved();
37        break;
38      }
39      case "PKT_show_home": {
40        this.browsingContext.topChromeWindow?.pktUI.onShowHome();
41        break;
42      }
43      case "PKT_close": {
44        this.browsingContext.topChromeWindow?.pktUI.closePanel();
45        break;
46      }
47      case "PKT_openTabWithUrl": {
48        this.browsingContext.topChromeWindow?.pktUI.onOpenTabWithUrl(
49          message.data,
50          this.browsingContext.embedderElement.contentPrincipal,
51          this.browsingContext.embedderElement.csp
52        );
53        break;
54      }
55      case "PKT_openTabWithPocketUrl": {
56        this.browsingContext.topChromeWindow?.pktUI.onOpenTabWithPocketUrl(
57          message.data,
58          this.browsingContext.embedderElement.contentPrincipal,
59          this.browsingContext.embedderElement.csp
60        );
61        break;
62      }
63      case "PKT_resizePanel": {
64        this.browsingContext.topChromeWindow?.pktUI.resizePanel(message.data);
65        this.sendResponseMessageToPanel("PKT_resizePanel");
66        break;
67      }
68      case "PKT_getTags": {
69        this.sendResponseMessageToPanel("PKT_getTags", pktApi.getTags());
70        break;
71      }
72      case "PKT_getSuggestedTags": {
73        // Ask for suggested tags based on passed url
74        const result = await new Promise(resolve => {
75          pktApi.getSuggestedTagsForURL(message.data.url, {
76            success: data => {
77              var successResponse = {
78                status: "success",
79                value: {
80                  suggestedTags: data.suggested_tags,
81                },
82              };
83              resolve(successResponse);
84            },
85            error: error => resolve({ status: "error", error }),
86          });
87        });
88
89        // If the doorhanger is still open, send the result.
90        if (this.isPanalAvailable()) {
91          this.sendResponseMessageToPanel("PKT_getSuggestedTags", result);
92        }
93        break;
94      }
95      case "PKT_addTags": {
96        // Pass url and array list of tags, add to existing save item accordingly
97        const result = await new Promise(resolve => {
98          pktApi.addTagsToURL(message.data.url, message.data.tags, {
99            success: () => resolve({ status: "success" }),
100            error: error => resolve({ status: "error", error }),
101          });
102        });
103
104        // If the doorhanger is still open, send the result.
105        if (this.isPanalAvailable()) {
106          this.sendResponseMessageToPanel("PKT_addTags", result);
107        }
108        break;
109      }
110      case "PKT_deleteItem": {
111        // Based on clicking "remove page" CTA, and passed unique item id, remove the item
112        const result = await new Promise(resolve => {
113          pktApi.deleteItem(message.data.itemId, {
114            success: () => {
115              resolve({ status: "success" });
116              SaveToPocket.itemDeleted();
117            },
118            error: error => resolve({ status: "error", error }),
119          });
120        });
121
122        // If the doorhanger is still open, send the result.
123        if (this.isPanalAvailable()) {
124          this.sendResponseMessageToPanel("PKT_deleteItem", result);
125        }
126        break;
127      }
128      case "PKT_log": {
129        console.log(...Object.values(message.data));
130        break;
131      }
132    }
133  }
134}
135