···13 <title>login · tangled</title>
14 </head>
15 <body class="flex items-center justify-center min-h-screen">
16+ <main class="max-w-md px-7 mt-4">
17 <h1 class="flex place-content-center text-3xl font-semibold italic dark:text-white" >
18 {{ template "fragments/logotype" }}
19 </h1>
···21 tightly-knit social coding.
22 </h2>
23 <form
24+ class="mt-4"
25 hx-post="/login"
26 hx-swap="none"
27 hx-disabled-elt="#login-button"
···56 <span>login</span>
57 </button>
58 </form>
59+ {{ if .ErrorCode }}
60+ <div class="flex gap-2 my-2 bg-red-50 dark:bg-red-900 border border-red-500 rounded drop-shadow-sm px-3 py-2 text-red-500 dark:text-red-300">
61+ <span class="py-1">{{ i "circle-alert" "w-4 h-4" }}</span>
62+ <div>
63+ <h5 class="font-medium">Login error</h5>
64+ <p class="text-sm">
65+ {{ if eq .ErrorCode "access_denied" }}
66+ You have not authorized the app.
67+ {{ else if eq .ErrorCode "session" }}
68+ Server failed to create user session.
69+ {{ else }}
70+ Internal Server error.
71+ {{ end }}
72+ Please try again.
73+ </p>
74+ </div>
75+ </div>
76+ {{ end }}
77 <p class="text-sm text-gray-500">
78 Don't have an account? <a href="/signup" class="underline">Create an account</a> on Tangled now!
79 </p>
+23
appview/pagination/page.go
···1package pagination
2003type Page struct {
4 Offset int // where to start from
5 Limit int // number of items in a page
···10 Offset: 0,
11 Limit: 30,
12 }
00000000000000000000013}
1415func (p Page) Previous() Page {
···1package pagination
23+import "context"
4+5type Page struct {
6 Offset int // where to start from
7 Limit int // number of items in a page
···12 Offset: 0,
13 Limit: 30,
14 }
15+}
16+17+type ctxKey struct{}
18+19+func IntoContext(ctx context.Context, page Page) context.Context {
20+ return context.WithValue(ctx, ctxKey{}, page)
21+}
22+23+func FromContext(ctx context.Context) Page {
24+ if ctx == nil {
25+ return FirstPage()
26+ }
27+ v := ctx.Value(ctxKey{})
28+ if v == nil {
29+ return FirstPage()
30+ }
31+ page, ok := v.(Page)
32+ if !ok {
33+ return FirstPage()
34+ }
35+ return page
36}
3738func (p Page) Previous() Page {
+10-30
appview/pulls/pulls.go
···205 )
206 if err != nil {
207 log.Println("failed to fetch labels", err)
208- s.pages.Error503(w, pages.ErrorPageParams{
209- LoggedInUser: user,
210- })
211 return
212 }
213···638 )
639 if err != nil {
640 log.Println("failed to fetch labels", err)
641- s.pages.Error503(w, pages.ErrorPageParams{
642- LoggedInUser: user,
643- })
644 return
645 }
646···789 if err != nil {
790 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
791 log.Println("failed to call XRPC repo.branches", xrpcerr)
792- s.pages.Error503(w, pages.ErrorPageParams{
793- LoggedInUser: user,
794- })
795 return
796 }
797 log.Println("failed to fetch branches", err)
···801 var result types.RepoBranchesResponse
802 if err := json.Unmarshal(xrpcBytes, &result); err != nil {
803 log.Println("failed to decode XRPC response", err)
804- s.pages.Error503(w, pages.ErrorPageParams{
805- LoggedInUser: user,
806- })
807 return
808 }
809···1400 if err != nil {
1401 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
1402 log.Println("failed to call XRPC repo.branches", xrpcerr)
1403- s.pages.Error503(w, pages.ErrorPageParams{
1404- LoggedInUser: user,
1405- })
1406 return
1407 }
1408 log.Println("failed to fetch branches", err)
···1412 var result types.RepoBranchesResponse
1413 if err := json.Unmarshal(xrpcBytes, &result); err != nil {
1414 log.Println("failed to decode XRPC response", err)
1415- s.pages.Error503(w, pages.ErrorPageParams{
1416- LoggedInUser: user,
1417- })
1418 return
1419 }
1420···1496 if err != nil {
1497 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
1498 log.Println("failed to call XRPC repo.branches for source", xrpcerr)
1499- s.pages.Error503(w, pages.ErrorPageParams{
1500- LoggedInUser: user,
1501- })
1502 return
1503 }
1504 log.Println("failed to fetch source branches", err)
···1509 var sourceBranches types.RepoBranchesResponse
1510 if err := json.Unmarshal(sourceXrpcBytes, &sourceBranches); err != nil {
1511 log.Println("failed to decode source branches XRPC response", err)
1512- s.pages.Error503(w, pages.ErrorPageParams{
1513- LoggedInUser: user,
1514- })
1515 return
1516 }
1517···1529 if err != nil {
1530 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
1531 log.Println("failed to call XRPC repo.branches for target", xrpcerr)
1532- s.pages.Error503(w, pages.ErrorPageParams{
1533- LoggedInUser: user,
1534- })
1535 return
1536 }
1537 log.Println("failed to fetch target branches", err)
···1542 var targetBranches types.RepoBranchesResponse
1543 if err := json.Unmarshal(targetXrpcBytes, &targetBranches); err != nil {
1544 log.Println("failed to decode target branches XRPC response", err)
1545- s.pages.Error503(w, pages.ErrorPageParams{
1546- LoggedInUser: user,
1547- })
1548 return
1549 }
1550
···205 )
206 if err != nil {
207 log.Println("failed to fetch labels", err)
208+ s.pages.Error503(w)
00209 return
210 }
211···636 )
637 if err != nil {
638 log.Println("failed to fetch labels", err)
639+ s.pages.Error503(w)
00640 return
641 }
642···785 if err != nil {
786 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
787 log.Println("failed to call XRPC repo.branches", xrpcerr)
788+ s.pages.Error503(w)
00789 return
790 }
791 log.Println("failed to fetch branches", err)
···795 var result types.RepoBranchesResponse
796 if err := json.Unmarshal(xrpcBytes, &result); err != nil {
797 log.Println("failed to decode XRPC response", err)
798+ s.pages.Error503(w)
00799 return
800 }
801···1392 if err != nil {
1393 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
1394 log.Println("failed to call XRPC repo.branches", xrpcerr)
1395+ s.pages.Error503(w)
001396 return
1397 }
1398 log.Println("failed to fetch branches", err)
···1402 var result types.RepoBranchesResponse
1403 if err := json.Unmarshal(xrpcBytes, &result); err != nil {
1404 log.Println("failed to decode XRPC response", err)
1405+ s.pages.Error503(w)
001406 return
1407 }
1408···1484 if err != nil {
1485 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
1486 log.Println("failed to call XRPC repo.branches for source", xrpcerr)
1487+ s.pages.Error503(w)
001488 return
1489 }
1490 log.Println("failed to fetch source branches", err)
···1495 var sourceBranches types.RepoBranchesResponse
1496 if err := json.Unmarshal(sourceXrpcBytes, &sourceBranches); err != nil {
1497 log.Println("failed to decode source branches XRPC response", err)
1498+ s.pages.Error503(w)
001499 return
1500 }
1501···1513 if err != nil {
1514 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
1515 log.Println("failed to call XRPC repo.branches for target", xrpcerr)
1516+ s.pages.Error503(w)
001517 return
1518 }
1519 log.Println("failed to fetch target branches", err)
···1524 var targetBranches types.RepoBranchesResponse
1525 if err := json.Unmarshal(targetXrpcBytes, &targetBranches); err != nil {
1526 log.Println("failed to decode target branches XRPC response", err)
1527+ s.pages.Error503(w)
001528 return
1529 }
1530