1 module oauth_page;
2 
3 import std.typecons;
4 import std.process;
5 
6 import awebview.wrapper;
7 import awebview.gui.html;
8 import awebview.gui.widgets.button;
9 import awebview.gui.widgets.text;
10 import awebview.gui.application;
11 import awebview.gui.activity;
12 
13 import graphite.twitter;
14 
15 import carbon.functional;
16 
17 
18 class OAuthPage : TemplateHTMLPage!(import(`oauth_page.html`))
19 {
20     private
21     alias NormalButton = InputButton!(["class": "btn btn-xs btn-primary"]);
22 
23 
24     this()
25     {
26         super("oauthPage");
27 
28         this ~= new InputText!()("iptCnsKey");
29         this ~= new InputText!()("iptCnsSct");
30 
31         this ~= new NormalButton("btnOpenBrowser").passTo!((a){
32             a.onClick.connect!"onClickOpenBrowser"(this);
33             a.staticProps["value"] = "ブラウザで開く";
34         });
35 
36         this ~= new NormalButton("btnDoOAuth").passTo!((a){
37             a.onClick.connect!"onClickDoOAuth"(this);
38             a.staticProps["value"] = "認証";
39         });
40 
41         this ~= new InputText!()("iptPinCode");
42     }
43 
44 
45     void onClickOpenBrowser(FiredContext ctx, WeakRef!(const(JSArrayCpp)) args)
46     {
47         auto cnsKey = elements["iptCnsKey"].to!ITextInput.text(),
48              cnsSct = elements["iptCnsSct"].to!ITextInput.text();
49 
50         if(_twTkn.isNull && cnsKey.length && cnsSct.length){
51             auto cnsTkn = ConsumerToken(cnsKey, cnsSct);
52             _twTkn = Twitter(Twitter.oauth.requestToken(cnsTkn, null));
53 
54             auto app = application.to!SDLApplication;
55             with(app.newFactoryOf!SDLActivity(WebPreferences.recommended)){
56                 id = "oauthWebPageActivity";
57                 width = 600;
58                 height = 400;
59                 title = "Twitter OAuth";
60 
61                 app.addActivity(newInstance.passTo!((a){
62                     a.load(new WebPage("oauthWebPage", _twTkn.callAPI!"oauth.authorizeURL"()));
63                 }));
64             }
65         }
66     }
67 
68 
69     override
70     void onUpdate()
71     {
72         if(auto pTwiPage = "oauthWebPageActivity" in activity.children)
73         {
74             if((*pTwiPage).querySelectorAll("#code-desc")["length"].get!uint){
75                 string str = (*pTwiPage)[$("code")]["innerHTML"].to!string;
76                 elements["iptPinCode"].to!ITextOutput.text = str;
77                 activity.children["oauthWebPageActivity"].close();
78                 onClickDoOAuthImpl();
79             }
80         }
81     }
82 
83 
84     void onClickDoOAuth(FiredContext ctx, WeakRef!(const(JSArrayCpp)) args)
85     {
86         onClickDoOAuthImpl();
87     }
88 
89 
90     void onClickDoOAuthImpl()
91     {
92         auto pinCode = elements["iptPinCode"].to!ITextInput.text();
93         if(!_twTkn.isNull && pinCode.length){
94             _twTkn = Twitter(_twTkn.callAPI!"oauth.accessToken"(pinCode));
95         }
96 
97         elements["btnOpenBrowser"]["disabled"] = true;
98         elements["btnDoOAuth"]["disabled"] = true;
99         activity.load("mainPage");
100     }
101 
102 
103     Nullable!Twitter token()
104     {
105         return _twTkn;
106     }
107 
108 
109   private:
110     NormalButton _btnOpenBrowser;
111     Nullable!Twitter _twTkn;
112 }