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