-
Notifications
You must be signed in to change notification settings - Fork 0
/
inertia.go
77 lines (58 loc) · 1.74 KB
/
inertia.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package inertia
import (
"encoding/json"
"github.com/gofiber/fiber/v2"
"github.com/refiber/framework/support"
"github.com/refiber/framework/utils"
)
type InertiaInterface interface {
SetViewTemplate(view string)
Render() *render
}
func New(s support.Refiber) *inertia {
return &inertia{s: s, viewTemplate: "app"}
}
type inertia struct {
s support.Refiber
viewTemplate string
}
func (i *inertia) Render() *render {
r := &render{}
r.inertia = i
r.viewTemplate = i.viewTemplate
return r
}
func (i *inertia) SetViewTemplate(view string) {
i.viewTemplate = view
}
type render struct {
*inertia
viewData *fiber.Map
}
func (r *render) SetViewData(data *fiber.Map) *render {
r.viewData = data
return r
}
func (r *render) Page(page string, props *fiber.Map) error {
sharedProps := fiber.Map{}
if session, err := r.s.GetSession().Get(r.s.GetCtx()); err == nil {
sharedProps = *support.GetSharedMap(session)
}
data := fiber.Map{}
data["url"] = r.s.GetCtx().OriginalURL()
v := utils.GetMD5Hash("./public/build/manifest.json")
data["version"] = v
data["component"] = page
data["props"] = utils.MergeFiberMaps(&sharedProps, props)
headers := r.s.GetCtx().GetReqHeaders()
headerXInertia, exist := headers["X-Inertia"]
headerXInertiaVersion, exist2 := headers["X-Inertia-Version"]
renderViewTemplate := !exist || !exist2 || len(headerXInertia) > 0 && headerXInertia[0] != "true" || len(headerXInertiaVersion) > 0 && headerXInertiaVersion[0] != v
if renderViewTemplate {
jsonProps, _ := json.Marshal(data)
viewData := createViewData(&jsonProps, r.viewData)
return r.s.GetCtx().Render(r.viewTemplate, viewData)
}
r.s.GetCtx().Response().Header.Set("X-Inertia", "true")
return r.s.GetCtx().Status(fiber.StatusOK).JSON(data)
}