github.com/vugu/vugu@v0.3.6-0.20240430171613-3f6f402e014b/vugufmt/testdata/ok/root.vugu (about)

     1  <div class='demo-comp'>
     2  	<div vg-if='data.isLoading'>Loading...</div>
     3  
     4  
     5  	<div
     6  		vg-if='len(data.bpi.BPI) > 0'>
     7  		<div>Updated: <span vg-html='data.bpi.Time.Updated'></span></div>
     8  		<ul>
     9  			<li vg-for='data.bpi.BPI'>
    10  				<span vg-html='key'></span> <span vg-html='fmt.Sprint(value.Symbol, value.RateFloat)'></span>
    11  			</li>
    12  		</ul>
    13  	</div>
    14  	<button @click='data.HandleClick(event)'>Fetch Bitcoin Price Index</button>
    15  </div>
    16  
    17  <script type='application/x-go'>
    18  import "encoding/json"
    19  import "net/http"
    20  import "log"
    21  
    22  type RootData struct {
    23  	bpi       bpi
    24  	isLoading bool
    25  }
    26  
    27  type bpi struct {
    28  	Time struct {
    29  		Updated string `json:"updated"`
    30  	} `json:"time"`
    31  	BPI map[string]struct {
    32  		Code      string  `json:"code"`
    33  		Symbol    string  `json:"symbol"`
    34  		RateFloat float64 `json:"rate_float"`
    35  	} `json:"bpi"`
    36  }
    37  
    38  func (data *RootData) HandleClick(event vugu.DOMEvent) {
    39  
    40  	data.bpi = bpi{}
    41  
    42  	go func(ee vugu.EventEnv) {
    43  
    44  		ee.Lock()
    45  		data.isLoading = true
    46  		ee.UnlockRender()
    47  
    48  		res, err := http.Get("https://api.coindesk.com/v1/bpi/currentprice.json")
    49  		if err != nil {
    50  			log.Printf("Error fetch()ing: %v", err)
    51  			return
    52  		}
    53  		defer res.Body.Close()
    54  
    55  		var newb bpi
    56  		err = json.NewDecoder(res.Body).Decode(&newb)
    57  		if err != nil {
    58  			log.Printf("Error JSON decoding: %v", err)
    59  			return
    60  		}
    61  
    62  		ee.Lock()
    63  		defer ee.UnlockRender()
    64  		data.bpi = newb
    65  		data.isLoading = false
    66  
    67  	}(event.EventEnv())
    68  }
    69  
    70  </script>