From b8e8cc3a6079c75920a6c9c72eb58d278cc5f861 Mon Sep 17 00:00:00 2001
From: DutchEllie <personal@quenten.nl>
Date: Mon, 18 Apr 2022 16:02:41 +0200
Subject: [PATCH] Added status check

---
 src/galaxiespage.go | 180 +++++++++++++++++++++++++++++++++-----------
 1 file changed, 136 insertions(+), 44 deletions(-)

diff --git a/src/galaxiespage.go b/src/galaxiespage.go
index 44c1602..d0d84c1 100644
--- a/src/galaxiespage.go
+++ b/src/galaxiespage.go
@@ -1,7 +1,11 @@
 package main
 
 import (
+	"bytes"
+	"encoding/json"
 	"fmt"
+	"io"
+	"net/http"
 
 	"github.com/maxence-charriere/go-app/v9/pkg/app"
 )
@@ -60,45 +64,24 @@ on their websites as well!`),
 										Body(
 											app.Li().
 												Body(
-													app.Div().
-														Body(
-															app.A().
-																Href("https://forestofunix.xyz").
-																Class("p-h3").
-																Class("m-t5").
-																Text("Forest of Unix"),
-															app.P().
-																Class("m-t5").
-																Text("A website made by Sebastiaan. A massive Linux fanboy, runs Gentoo on his ThinkPad. Absolutely based."),
-														),
+													newLinkWithStatus().
+														Link("https://forestofunix.xyz").
+														LinkText("Forest of Unix").
+														Text("A website made by Sebastiaan. A massive Linux fanboy, runs Gentoo on his ThinkPad. Absolutely based."),
 												),
 											app.Li().
 												Body(
-													app.Div().
-														Body(
-															app.A().
-																Href("https://nymphali.neocities.org").
-																Class("p-h3").
-																Class("m-t5").
-																Text("Nymphali"),
-															app.P().
-																Class("m-t5").
-																Text("The website made by ■■■■■■, whoops Nymphali. They have an awesome minimalist website that's just lovely."),
-														),
+													newLinkWithStatus().
+														Link("https://nymphali.neocities.org").
+														LinkText("Nymphali").
+														Text("The website made by ■■■■■■, whoops Nymphali. They have an awesome minimalist website that's just lovely."),
 												),
 											app.Li().
 												Body(
-													app.Div().
-														Body(
-															app.A().
-																Href("https://kristypixel.neocities.org").
-																Class("p-h3").
-																Class("m-t5").
-																Text("Kristy"),
-															app.P().
-																Class("m-t5").
-																Text("Website made by Kristy. Very cute website, I love it! Keep up the awesome work!"),
-														),
+													newLinkWithStatus().
+														Link("https://kristypixel.neocities.org").
+														LinkText("Kristypixel").
+														Text("Website made by Kristy. Very cute website, I love it! Keep up the awesome work!"),
 												),
 										),
 								),
@@ -118,17 +101,10 @@ on their websites as well!`),
 										Body(
 											app.Li().
 												Body(
-													app.Div().
-														Body(
-															app.A().
-																Href("https://evillious.ylimegirl.com").
-																Class("p-h3").
-																Class("m-t5").
-																Text("Evillious Chronicles fan guide"),
-															app.P().
-																Class("m-t5").
-																Text("A VERY cool website made by Ylimegirl! They wrote a whole website dedicated to Evillious Chronicles, which is a super good Japanese light novel and vocaloid series!! Definitely look it up!"),
-														),
+													newLinkWithStatus().
+														Link("https://evillious.ylimegirl.com").
+														LinkText("Evillious Chronicles fan guide").
+														Text("A VERY cool website made by Ylimegirl! They wrote a whole website dedicated to Evillious Chronicles, which is a super good Japanese light novel and vocaloid series!! Definitely look it up!"),
 												),
 											app.Li().
 												Body(
@@ -180,3 +156,119 @@ on their websites as well!`),
 func (f *GalaxiesPage) onMouseOverGnu(ctx app.Context, e app.Event) {
 
 }*/
+
+//#################################
+//##                            ###
+//## Link with status component ###
+//##                            ###
+//#################################
+
+type linkWithStatus struct {
+	app.Compo
+
+	Ilink     string
+	IText     string
+	ILinkText string
+	status    bool
+}
+
+func newLinkWithStatus() *linkWithStatus {
+	return &linkWithStatus{}
+}
+
+func (f *linkWithStatus) Link(s string) *linkWithStatus {
+	f.Ilink = s
+	return f
+}
+
+func (f *linkWithStatus) LinkText(s string) *linkWithStatus {
+	f.ILinkText = s
+	return f
+}
+
+func (f *linkWithStatus) Text(s string) *linkWithStatus {
+	f.IText = s
+	return f
+}
+
+func (f *linkWithStatus) checkStatus(ctx app.Context) {
+	ctx.Async(func() {
+		data := struct {
+			Url string `json:"url"`
+		}{
+			Url: f.Ilink,
+		}
+		jsondata, err := json.Marshal(data)
+		if err != nil {
+			app.Log(err)
+			return
+		}
+
+		req, err := http.NewRequest("POST", ApiURL+"/checkonline", bytes.NewBuffer(jsondata))
+		if err != nil {
+			app.Log(err)
+			return
+		}
+		resp, err := http.DefaultClient.Do(req)
+		if err != nil {
+			app.Log(err)
+			return
+		}
+		defer resp.Body.Close()
+
+		body, err := io.ReadAll(resp.Body)
+		if err != nil {
+			app.Log(err)
+			return
+		}
+
+		jsonresp := struct {
+			Status bool `json:"status"`
+		}{}
+		err = json.Unmarshal(body, &jsonresp)
+		if err != nil {
+			app.Log(err)
+			return
+		}
+
+		ctx.Dispatch(func(ctx app.Context) {
+			f.status = jsonresp.Status
+		})
+	})
+}
+
+func (f *linkWithStatus) OnNav(ctx app.Context) {
+	f.checkStatus(ctx)
+}
+
+func (f *linkWithStatus) Render() app.UI {
+	return app.Div().
+		Body(
+			app.Div().
+				Style("display", "flex").
+				Style("gap", "20px").
+				Body(
+					app.A().
+						Href(f.Ilink).
+						Class("p-h3").
+						Class("m-t5").
+						Text(f.ILinkText),
+					app.If(f.status,
+						app.P().
+							Style("color", "green").
+							Style("width", "fit-content").
+							Style("margin", "5px 0px 0px 0px").
+							Text("Online"),
+					).Else(
+						app.P().
+							Style("color", "red").
+							Style("width", "fit-content").
+							Style("margin", "5px 0px 0px 0px").
+							Text("Offline"),
+					),
+				),
+			app.P().
+				Class("m-t5").
+				Text(f.IText),
+		)
+}