@@ -2,12 +2,12 @@ use std::fmt::Debug;
2
2
3
3
use serde_json:: { to_string_pretty, Value } ;
4
4
use web_sys:: { HtmlInputElement , MouseEvent } ;
5
- use yew:: { function_component, html, Callback , Html , Properties , TargetCast } ;
5
+ use yew:: { function_component, html, use_state , Callback , Html , Properties , TargetCast } ;
6
6
use yew_hooks:: use_clipboard;
7
7
use yew_notifications:: { use_notification, Notification , NotificationType } ;
8
8
9
9
use super :: Jwt ;
10
- use crate :: common:: { build_simple_output, BytesFormat } ;
10
+ use crate :: common:: { build_simple_output, BytesFormat , Switch , TableView } ;
11
11
use crate :: utils:: copy_to_clipboard_with_notification;
12
12
13
13
#[ derive( PartialEq , Properties ) ]
@@ -142,6 +142,14 @@ pub fn jwt_editor(props: &JwtEditorProps) -> Html {
142
142
set_jwt. emit ( jwt) ;
143
143
} ) ;
144
144
145
+ // false - raw view
146
+ // true - table view
147
+ let header_view = use_state ( || true ) ;
148
+ let payload_view = use_state ( || true ) ;
149
+
150
+ let header_view_setter = header_view. setter ( ) ;
151
+ let payload_view_setter = payload_view. setter ( ) ;
152
+
145
153
let notifications = use_notification :: < Notification > ( ) ;
146
154
let clipboard = use_clipboard ( ) ;
147
155
@@ -152,16 +160,34 @@ pub fn jwt_editor(props: &JwtEditorProps) -> Html {
152
160
<span class="jwt-header" onclick={ copy_to_clipboard_with_notification( header. clone( ) , clipboard. clone( ) , "Header" , notifications. clone( ) ) } >{ "Header" } </span>
153
161
<button onclick={ header_on_pretty} class="jwt-util-button" >{ "Prettify" } </button>
154
162
<button onclick={ header_on_minify} class="jwt-util-button" >{ "Minify" } </button>
163
+ <div class="horizontal" >
164
+ <span class="total" >{ "raw" } </span>
165
+ <Switch id={ String :: from( "jwt-header-view" ) } state={ * header_view} setter={ Callback :: from( move |view| header_view_setter. set( view) ) } />
166
+ <span class="total" >{ "table" } </span>
167
+ </div>
155
168
</div>
156
- <textarea rows="4" class="base-input" value={ header} oninput={ on_header_input} />
169
+ { if !* header_view { html! {
170
+ <textarea rows="4" class="base-input" value={ header} oninput={ on_header_input} />
171
+ } } else { html! {
172
+ <TableView value={ serde_json:: from_str:: <Value >( & props. jwt. parsed_header) . unwrap( ) } />
173
+ } } }
157
174
</div>
158
175
<div class="vertical" >
159
176
<div class="horizontal" >
160
177
<span class="jwt-payload" onclick={ copy_to_clipboard_with_notification( payload. clone( ) , clipboard. clone( ) , "Payload" , notifications. clone( ) ) } >{ "Payload" } </span>
161
178
<button onclick={ payload_on_pretty} class="jwt-util-button" >{ "Prettify" } </button>
162
179
<button onclick={ payload_on_minify} class="jwt-util-button" >{ "Minify" } </button>
180
+ <div class="horizontal" >
181
+ <span class="total" >{ "raw" } </span>
182
+ <Switch id={ String :: from( "jwt-payload-view" ) } state={ * payload_view} setter={ Callback :: from( move |view| payload_view_setter. set( view) ) } />
183
+ <span class="total" >{ "table" } </span>
184
+ </div>
163
185
</div>
164
- <textarea rows="6" class="base-input" value={ payload} oninput={ on_payload_input} />
186
+ { if !* payload_view { html! {
187
+ <textarea rows="6" class="base-input" value={ payload} oninput={ on_payload_input} />
188
+ } } else { html! {
189
+ <TableView value={ serde_json:: from_str:: <Value >( & props. jwt. parsed_payload) . unwrap( ) } />
190
+ } } }
165
191
</div>
166
192
<div class="vertical" >
167
193
<span class="jwt-signature" onclick={ copy_to_clipboard_with_notification( signature. clone( ) , clipboard, "Signature" , notifications. clone( ) ) } >{ "Signature" } </span>
0 commit comments