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