Merge branch 'main' into web-layout

This commit is contained in:
Dan Abramov
2023-12-19 02:54:41 +00:00
55 changed files with 1596 additions and 1159 deletions
+1
View File
@@ -10,6 +10,7 @@ help: ## Print info about all commands
.PHONY: build-web .PHONY: build-web
build-web: ## Compile web bundle, copy to bskyweb directory build-web: ## Compile web bundle, copy to bskyweb directory
yarn intl:build
yarn build-web yarn build-web
.PHONY: test .PHONY: test
+2 -2
View File
@@ -9,12 +9,12 @@ module.exports = function () {
/** /**
* iOS build number. Must be incremented for each TestFlight version. * iOS build number. Must be incremented for each TestFlight version.
*/ */
const IOS_BUILD_NUMBER = '2' const IOS_BUILD_NUMBER = '5'
/** /**
* Android build number. Must be incremented for each release. * Android build number. Must be incremented for each release.
*/ */
const ANDROID_VERSION_CODE = 49 const ANDROID_VERSION_CODE = 51
/** /**
* Uses built-in Expo env vars * Uses built-in Expo env vars
Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 237 KiB

After

Width:  |  Height:  |  Size: 452 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 360 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 354 KiB

After

Width:  |  Height:  |  Size: 1.4 MiB

+1 -1
View File
@@ -42,4 +42,4 @@ check: ## Compile everything, checking syntax (does not output binaries)
.PHONY: run-dev-bskyweb .PHONY: run-dev-bskyweb
run-dev-bskyweb: .env ## Runs 'bskyweb' for local dev run-dev-bskyweb: .env ## Runs 'bskyweb' for local dev
GOLOG_LOG_LEVEL=info go run ./cmd/bskyweb serve --debug GOLOG_LOG_LEVEL=info go run ./cmd/bskyweb serve
+99
View File
@@ -0,0 +1,99 @@
package main
import (
"fmt"
"net/http"
appbsky "github.com/bluesky-social/indigo/api/bsky"
"github.com/bluesky-social/indigo/atproto/syntax"
"github.com/labstack/echo/v4"
)
// We don't actually populate the title for "posts".
// Some background: https://book.micro.blog/rss-for-microblogs/
type Item struct {
Title string `xml:"title,omitempty"`
Link string `xml:"link,omitempty"`
Description string `xml:"description,omitempty"`
PubDate string `xml:"pubDate,omitempty"`
Author string `xml:"author,omitempty"`
GUID string `xml:"guid,omitempty"`
}
type rss struct {
Version string `xml:"version,attr"`
Description string `xml:"channel>description,omitempty"`
Link string `xml:"channel>link"`
Title string `xml:"channel>title"`
Item []Item `xml:"channel>item"`
}
func (srv *Server) WebProfileRSS(c echo.Context) error {
ctx := c.Request().Context()
didParam := c.Param("did")
did, err := syntax.ParseDID(didParam)
if err != nil {
return echo.NewHTTPError(400, fmt.Sprintf("not a valid DID: %s", didParam))
}
// check that public view is Ok
pv, err := appbsky.ActorGetProfile(ctx, srv.xrpcc, did.String())
if err != nil {
return echo.NewHTTPError(404, fmt.Sprintf("account not found: %s", did))
}
for _, label := range pv.Labels {
if label.Src == pv.Did && label.Val == "!no-unauthenticated" {
return echo.NewHTTPError(403, fmt.Sprintf("account does not allow public views: %s", did))
}
}
af, err := appbsky.FeedGetAuthorFeed(ctx, srv.xrpcc, did.String(), "", "", 30)
if err != nil {
log.Warn("failed to fetch author feed", "did", did, "err", err)
return err
}
posts := []Item{}
for _, p := range af.Feed {
// only include author's own posts in RSS
if p.Post.Author.Did != pv.Did {
continue
}
aturi, err := syntax.ParseATURI(p.Post.Uri)
if err != nil {
return err
}
rec := p.Post.Record.Val.(*appbsky.FeedPost)
// only top-level posts in RSS (no replies)
if rec.Reply != nil {
continue
}
posts = append(posts, Item{
Link: fmt.Sprintf("https://bsky.app/profile/%s/post/%s", pv.Handle, aturi.RecordKey().String()),
Description: rec.Text,
PubDate: rec.CreatedAt,
Author: "@" + pv.Handle,
GUID: aturi.String(),
})
}
title := "@" + pv.Handle
if pv.DisplayName != nil {
title = title + " - " + *pv.DisplayName
}
desc := ""
if pv.Description != nil {
desc = *pv.Description
}
feed := &rss{
Version: "2.0",
Description: desc,
Link: fmt.Sprintf("https://bsky.app/profile/%s", pv.Handle),
Title: title,
Item: posts,
}
return c.XML(http.StatusOK, feed)
}
+73 -55
View File
@@ -15,7 +15,8 @@ import (
"time" "time"
appbsky "github.com/bluesky-social/indigo/api/bsky" appbsky "github.com/bluesky-social/indigo/api/bsky"
cliutil "github.com/bluesky-social/indigo/cmd/gosky/util" "github.com/bluesky-social/indigo/atproto/syntax"
"github.com/bluesky-social/indigo/util/cliutil"
"github.com/bluesky-social/indigo/xrpc" "github.com/bluesky-social/indigo/xrpc"
"github.com/bluesky-social/social-app/bskyweb" "github.com/bluesky-social/social-app/bskyweb"
@@ -208,6 +209,9 @@ func serve(cctx *cli.Context) error {
e.GET("/profile/:handle/feed/:rkey", server.WebGeneric) e.GET("/profile/:handle/feed/:rkey", server.WebGeneric)
e.GET("/profile/:handle/feed/:rkey/liked-by", server.WebGeneric) e.GET("/profile/:handle/feed/:rkey/liked-by", server.WebGeneric)
// profile RSS feed (DID not handle)
e.GET("/profile/:did/rss", server.WebProfileRSS)
// post endpoints; only first populates info // post endpoints; only first populates info
e.GET("/profile/:handle/post/:rkey", server.WebPost) e.GET("/profile/:handle/post/:rkey", server.WebPost)
e.GET("/profile/:handle/post/:rkey/liked-by", server.WebGeneric) e.GET("/profile/:handle/post/:rkey/liked-by", server.WebGeneric)
@@ -285,73 +289,87 @@ func (srv *Server) WebHome(c echo.Context) error {
} }
func (srv *Server) WebPost(c echo.Context) error { func (srv *Server) WebPost(c echo.Context) error {
ctx := c.Request().Context()
data := pongo2.Context{} data := pongo2.Context{}
handle := c.Param("handle")
rkey := c.Param("rkey")
// sanity check argument
if len(handle) > 4 && len(handle) < 128 && len(rkey) > 0 {
ctx := c.Request().Context()
// requires two fetches: first fetch profile (!)
pv, err := appbsky.ActorGetProfile(ctx, srv.xrpcc, handle)
if err != nil {
log.Warnf("failed to fetch handle: %s\t%v", handle, err)
} else {
unauthedViewingOkay := true
for _, label := range pv.Labels {
if label.Src == pv.Did && label.Val == "!no-unauthenticated" {
unauthedViewingOkay = false
}
}
if unauthedViewingOkay { // sanity check arguments. don't 4xx, just let app handle if not expected format
did := pv.Did rkeyParam := c.Param("rkey")
data["did"] = did rkey, err := syntax.ParseRecordKey(rkeyParam)
if err != nil {
return c.Render(http.StatusOK, "post.html", data)
}
handleParam := c.Param("handle")
handle, err := syntax.ParseHandle(handleParam)
if err != nil {
return c.Render(http.StatusOK, "post.html", data)
}
handle = handle.Normalize()
// then fetch the post thread (with extra context) // requires two fetches: first fetch profile (!)
uri := fmt.Sprintf("at://%s/app.bsky.feed.post/%s", did, rkey) pv, err := appbsky.ActorGetProfile(ctx, srv.xrpcc, handle.String())
tpv, err := appbsky.FeedGetPostThread(ctx, srv.xrpcc, 1, uri) if err != nil {
if err != nil { log.Warnf("failed to fetch handle: %s\t%v", handle, err)
log.Warnf("failed to fetch post: %s\t%v", uri, err) return c.Render(http.StatusOK, "post.html", data)
} else { }
req := c.Request() unauthedViewingOkay := true
postView := tpv.Thread.FeedDefs_ThreadViewPost.Post for _, label := range pv.Labels {
data["postView"] = postView if label.Src == pv.Did && label.Val == "!no-unauthenticated" {
data["requestURI"] = fmt.Sprintf("https://%s%s", req.Host, req.URL.Path) unauthedViewingOkay = false
if postView.Embed != nil && postView.Embed.EmbedImages_View != nil {
data["imgThumbUrl"] = postView.Embed.EmbedImages_View.Images[0].Thumb
}
}
}
} }
}
if !unauthedViewingOkay {
return c.Render(http.StatusOK, "post.html", data)
}
did := pv.Did
data["did"] = did
// then fetch the post thread (with extra context)
uri := fmt.Sprintf("at://%s/app.bsky.feed.post/%s", did, rkey)
tpv, err := appbsky.FeedGetPostThread(ctx, srv.xrpcc, 1, 0, uri)
if err != nil {
log.Warnf("failed to fetch post: %s\t%v", uri, err)
return c.Render(http.StatusOK, "post.html", data)
}
req := c.Request()
postView := tpv.Thread.FeedDefs_ThreadViewPost.Post
data["postView"] = postView
data["requestURI"] = fmt.Sprintf("https://%s%s", req.Host, req.URL.Path)
if postView.Embed != nil && postView.Embed.EmbedImages_View != nil {
data["imgThumbUrl"] = postView.Embed.EmbedImages_View.Images[0].Thumb
} }
return c.Render(http.StatusOK, "post.html", data) return c.Render(http.StatusOK, "post.html", data)
} }
func (srv *Server) WebProfile(c echo.Context) error { func (srv *Server) WebProfile(c echo.Context) error {
ctx := c.Request().Context()
data := pongo2.Context{} data := pongo2.Context{}
handle := c.Param("handle")
// sanity check argument // sanity check arguments. don't 4xx, just let app handle if not expected format
if len(handle) > 4 && len(handle) < 128 { handleParam := c.Param("handle")
ctx := c.Request().Context() handle, err := syntax.ParseHandle(handleParam)
pv, err := appbsky.ActorGetProfile(ctx, srv.xrpcc, handle) if err != nil {
if err != nil { return c.Render(http.StatusOK, "profile.html", data)
log.Warnf("failed to fetch handle: %s\t%v", handle, err) }
} else { handle = handle.Normalize()
unauthedViewingOkay := true
for _, label := range pv.Labels { pv, err := appbsky.ActorGetProfile(ctx, srv.xrpcc, handle.String())
if label.Src == pv.Did && label.Val == "!no-unauthenticated" { if err != nil {
unauthedViewingOkay = false log.Warnf("failed to fetch handle: %s\t%v", handle, err)
} return c.Render(http.StatusOK, "profile.html", data)
} }
if unauthedViewingOkay { unauthedViewingOkay := true
req := c.Request() for _, label := range pv.Labels {
data["profileView"] = pv if label.Src == pv.Did && label.Val == "!no-unauthenticated" {
data["requestURI"] = fmt.Sprintf("https://%s%s", req.Host, req.URL.Path) unauthedViewingOkay = false
}
} }
} }
if !unauthedViewingOkay {
return c.Render(http.StatusOK, "profile.html", data)
}
req := c.Request()
data["profileView"] = pv
data["requestURI"] = fmt.Sprintf("https://%s%s", req.Host, req.URL.Path)
return c.Render(http.StatusOK, "profile.html", data) return c.Render(http.StatusOK, "profile.html", data)
} }
+1 -1
View File
@@ -1,2 +1,2 @@
GOLOG_LOG_LEVEL=info GOLOG_LOG_LEVEL=info
ATP_APPVIEW_HOST=https://api.bsky.app ATP_APPVIEW_HOST=https://public.api.bsky.app
+55 -39
View File
@@ -3,88 +3,104 @@ module github.com/bluesky-social/social-app/bskyweb
go 1.21 go 1.21
require ( require (
github.com/bluesky-social/indigo v0.0.0-20230504025040-8915cccc3319 github.com/bluesky-social/indigo v0.0.0-20231216010655-ad730a7da4f5
github.com/flosch/pongo2/v6 v6.0.0 github.com/flosch/pongo2/v6 v6.0.0
github.com/ipfs/go-log v1.0.5 github.com/ipfs/go-log v1.0.5
github.com/joho/godotenv v1.5.1 github.com/joho/godotenv v1.5.1
github.com/klauspost/compress v1.16.5 github.com/klauspost/compress v1.17.3
github.com/labstack/echo/v4 v4.10.2 github.com/labstack/echo/v4 v4.11.3
github.com/urfave/cli/v2 v2.25.3 github.com/urfave/cli/v2 v2.25.7
) )
require ( require (
github.com/benbjohnson/clock v1.3.0 // indirect github.com/beorn7/perks v1.0.1 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/carlmjohnson/versioninfo v0.22.5 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect
github.com/go-logr/logr v1.2.4 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/go-logr/logr v1.3.0 // indirect
github.com/go-logr/stdr v1.2.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect
github.com/goccy/go-json v0.10.2 // indirect github.com/goccy/go-json v0.10.2 // indirect
github.com/gogo/protobuf v1.3.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang-jwt/jwt v3.2.2+incompatible // indirect github.com/golang-jwt/jwt v3.2.2+incompatible // indirect
github.com/google/uuid v1.3.0 // indirect github.com/google/uuid v1.4.0 // indirect
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
github.com/hashicorp/go-retryablehttp v0.7.2 // indirect github.com/hashicorp/go-retryablehttp v0.7.5 // indirect
github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect
github.com/hashicorp/golang-lru/arc/v2 v2.0.6 // indirect
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
github.com/ipfs/bbloom v0.0.4 // indirect github.com/ipfs/bbloom v0.0.4 // indirect
github.com/ipfs/go-block-format v0.1.2 // indirect github.com/ipfs/go-block-format v0.2.0 // indirect
github.com/ipfs/go-cid v0.4.1 // indirect github.com/ipfs/go-cid v0.4.1 // indirect
github.com/ipfs/go-datastore v0.6.0 // indirect github.com/ipfs/go-datastore v0.6.0 // indirect
github.com/ipfs/go-ipfs-blockstore v1.3.0 // indirect github.com/ipfs/go-ipfs-blockstore v1.3.1 // indirect
github.com/ipfs/go-ipfs-ds-help v1.1.0 // indirect github.com/ipfs/go-ipfs-ds-help v1.1.1 // indirect
github.com/ipfs/go-ipfs-util v0.0.2 // indirect github.com/ipfs/go-ipfs-util v0.0.3 // indirect
github.com/ipfs/go-ipld-cbor v0.0.7-0.20230126201833-a73d038d90bc // indirect github.com/ipfs/go-ipld-cbor v0.1.0 // indirect
github.com/ipfs/go-ipld-format v0.4.0 // indirect github.com/ipfs/go-ipld-format v0.6.0 // indirect
github.com/ipfs/go-log/v2 v2.5.1 // indirect github.com/ipfs/go-log/v2 v2.5.1 // indirect
github.com/ipfs/go-metrics-interface v0.0.1 // indirect github.com/ipfs/go-metrics-interface v0.0.1 // indirect
github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 // indirect
github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect
github.com/jackc/pgx/v5 v5.3.1 // indirect github.com/jackc/pgx/v5 v5.5.0 // indirect
github.com/jackc/puddle/v2 v2.2.1 // indirect
github.com/jbenet/goprocess v0.1.4 // indirect github.com/jbenet/goprocess v0.1.4 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect github.com/jinzhu/now v1.1.5 // indirect
github.com/klauspost/cpuid/v2 v2.2.4 // indirect github.com/klauspost/cpuid/v2 v2.2.6 // indirect
github.com/labstack/gommon v0.4.0 // indirect github.com/labstack/gommon v0.4.1 // indirect
github.com/lestrrat-go/blackmagic v1.0.1 // indirect github.com/lestrrat-go/blackmagic v1.0.1 // indirect
github.com/lestrrat-go/httpcc v1.0.1 // indirect github.com/lestrrat-go/httpcc v1.0.1 // indirect
github.com/lestrrat-go/httprc v1.0.4 // indirect github.com/lestrrat-go/httprc v1.0.4 // indirect
github.com/lestrrat-go/iter v1.0.2 // indirect github.com/lestrrat-go/iter v1.0.2 // indirect
github.com/lestrrat-go/jwx/v2 v2.0.9 // indirect github.com/lestrrat-go/jwx/v2 v2.0.12 // indirect
github.com/lestrrat-go/option v1.0.1 // indirect github.com/lestrrat-go/option v1.0.1 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.18 // indirect github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-sqlite3 v1.14.16 // indirect github.com/mattn/go-sqlite3 v1.14.18 // indirect
github.com/minio/sha256-simd v1.0.0 // indirect github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect
github.com/minio/sha256-simd v1.0.1 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/mr-tron/base58 v1.2.0 // indirect github.com/mr-tron/base58 v1.2.0 // indirect
github.com/multiformats/go-base32 v0.1.0 // indirect github.com/multiformats/go-base32 v0.1.0 // indirect
github.com/multiformats/go-base36 v0.2.0 // indirect github.com/multiformats/go-base36 v0.2.0 // indirect
github.com/multiformats/go-multibase v0.2.0 // indirect github.com/multiformats/go-multibase v0.2.0 // indirect
github.com/multiformats/go-multihash v0.2.1 // indirect github.com/multiformats/go-multihash v0.2.3 // indirect
github.com/multiformats/go-varint v0.0.7 // indirect github.com/multiformats/go-varint v0.0.7 // indirect
github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f // indirect github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f // indirect
github.com/prometheus/client_golang v1.17.0 // indirect
github.com/prometheus/client_model v0.5.0 // indirect
github.com/prometheus/common v0.45.0 // indirect
github.com/prometheus/procfs v0.12.0 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/segmentio/asm v1.2.0 // indirect
github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/valyala/fasttemplate v1.2.2 // indirect github.com/valyala/fasttemplate v1.2.2 // indirect
github.com/whyrusleeping/cbor-gen v0.0.0-20230418232409-daab9ece03a0 // indirect github.com/whyrusleeping/cbor-gen v0.0.0-20230923211252-36a87e1ba72f // indirect
github.com/whyrusleeping/go-did v0.0.0-20230301193428-2146016fc220 // indirect github.com/whyrusleeping/go-did v0.0.0-20230824162731-404d1707d5d6 // indirect
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
go.opentelemetry.io/otel v1.15.1 // indirect gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b // indirect
go.opentelemetry.io/otel/trace v1.15.1 // indirect gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 // indirect
go.opentelemetry.io/otel v1.21.0 // indirect
go.opentelemetry.io/otel/metric v1.21.0 // indirect
go.opentelemetry.io/otel/trace v1.21.0 // indirect
go.uber.org/atomic v1.11.0 // indirect go.uber.org/atomic v1.11.0 // indirect
go.uber.org/multierr v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.24.0 // indirect go.uber.org/zap v1.26.0 // indirect
golang.org/x/crypto v0.8.0 // indirect golang.org/x/crypto v0.15.0 // indirect
golang.org/x/net v0.9.0 // indirect golang.org/x/net v0.18.0 // indirect
golang.org/x/sys v0.7.0 // indirect golang.org/x/sync v0.5.0 // indirect
golang.org/x/text v0.9.0 // indirect golang.org/x/sys v0.14.0 // indirect
golang.org/x/text v0.14.0 // indirect
golang.org/x/time v0.3.0 // indirect golang.org/x/time v0.3.0 // indirect
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect
google.golang.org/protobuf v1.31.0 // indirect
gorm.io/driver/postgres v1.5.0 // indirect gorm.io/driver/postgres v1.5.0 // indirect
gorm.io/driver/sqlite v1.5.0 // indirect gorm.io/driver/sqlite v1.5.4 // indirect
gorm.io/gorm v1.25.0 // indirect gorm.io/gorm v1.25.5 // indirect
lukechampine.com/blake3 v1.1.7 // indirect lukechampine.com/blake3 v1.2.1 // indirect
) )
+132 -116
View File
@@ -1,25 +1,30 @@
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bluesky-social/indigo v0.0.0-20230504025040-8915cccc3319 h1:VCNXRXpgyK3xkaQ8fzL5WzswerwLycke4B9ggLs1uOA= github.com/bluesky-social/indigo v0.0.0-20231216010655-ad730a7da4f5 h1:Zk1c+mxCYH6G/vLL0+9lO2Eci4OT3AFy73qPWa9auDM=
github.com/bluesky-social/indigo v0.0.0-20230504025040-8915cccc3319/go.mod h1:Hc09SUJXAIujaAvq7JXxi8ZQQI887grzPkHgn4JyE1Q= github.com/bluesky-social/indigo v0.0.0-20231216010655-ad730a7da4f5/go.mod h1:a8cPbqDkRX+aPwJnXF7kAi3PF26hYiR4w5H8624MB7k=
github.com/carlmjohnson/versioninfo v0.22.5 h1:O00sjOLUAFxYQjlN/bzYTuZiS0y6fWDQjMRvwtKgwwc=
github.com/carlmjohnson/versioninfo v0.22.5/go.mod h1:QT9mph3wcVfISUKd0i9sZfVrPviHuSF+cUtLjm2WSf8=
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM=
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0=
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/flosch/pongo2/v6 v6.0.0 h1:lsGru8IAzHgIAw6H2m4PCyleO58I40ow6apih0WprMU= github.com/flosch/pongo2/v6 v6.0.0 h1:lsGru8IAzHgIAw6H2m4PCyleO58I40ow6apih0WprMU=
github.com/flosch/pongo2/v6 v6.0.0/go.mod h1:CuDpFm47R0uGGE7z13/tTlt1Y6zdxvr2RLT5LJhsHEU= github.com/flosch/pongo2/v6 v6.0.0/go.mod h1:CuDpFm47R0uGGE7z13/tTlt1Y6zdxvr2RLT5LJhsHEU=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=
github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0=
@@ -29,53 +34,49 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU=
github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48=
github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=
github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
github.com/hashicorp/go-hclog v0.9.2 h1:CG6TE5H9/JXsFWJCfoIVpKFIkFe6ysEuHirp4DxCsHI= github.com/hashicorp/go-hclog v0.9.2 h1:CG6TE5H9/JXsFWJCfoIVpKFIkFe6ysEuHirp4DxCsHI=
github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
github.com/hashicorp/go-retryablehttp v0.7.2 h1:AcYqCvkpalPnPF2pn0KamgwamS42TqUDDYFRKq/RAd0= github.com/hashicorp/go-retryablehttp v0.7.5 h1:bJj+Pj19UZMIweq/iie+1u5YCdGrnxCT9yvm0e+Nd5M=
github.com/hashicorp/go-retryablehttp v0.7.2/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= github.com/hashicorp/go-retryablehttp v0.7.5/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8=
github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
github.com/hashicorp/golang-lru/arc/v2 v2.0.6 h1:4NU7uP5vSoK6TbaMj3NtY478TTAWLso/vL1gpNrInHg=
github.com/hashicorp/golang-lru/arc/v2 v2.0.6/go.mod h1:cfdDIX05DWvYV6/shsxDfa/OVcRieOt+q4FnM8x+Xno=
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= github.com/ipfs/go-block-format v0.2.0 h1:ZqrkxBA2ICbDRbK8KJs/u0O3dlp6gmAuuXUJNiW1Ycs=
github.com/ipfs/go-block-format v0.1.2 h1:GAjkfhVx1f4YTODS6Esrj1wt2HhrtwTnhEr+DyPUaJo= github.com/ipfs/go-block-format v0.2.0/go.mod h1:+jpL11nFx5A/SPpsoBn6Bzkra/zaArfSmsknbPMYgzM=
github.com/ipfs/go-block-format v0.1.2/go.mod h1:mACVcrxarQKstUU3Yf/RdwbC4DzPV6++rO2a3d+a/KE=
github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM=
github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM=
github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog=
github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I=
github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s=
github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk=
github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk=
github.com/ipfs/go-datastore v0.6.0 h1:JKyz+Gvz1QEZw0LsX1IBn+JFCJQH4SJVFtM4uWU0Myk= github.com/ipfs/go-datastore v0.6.0 h1:JKyz+Gvz1QEZw0LsX1IBn+JFCJQH4SJVFtM4uWU0Myk=
github.com/ipfs/go-datastore v0.6.0/go.mod h1:rt5M3nNbSO/8q1t4LNkLyUwRs8HupMeN/8O4Vn9YAT8= github.com/ipfs/go-datastore v0.6.0/go.mod h1:rt5M3nNbSO/8q1t4LNkLyUwRs8HupMeN/8O4Vn9YAT8=
github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk=
github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps=
github.com/ipfs/go-ipfs-blockstore v1.3.0 h1:m2EXaWgwTzAfsmt5UdJ7Is6l4gJcaM/A12XwJyvYvMM= github.com/ipfs/go-ipfs-blockstore v1.3.1 h1:cEI9ci7V0sRNivqaOr0elDsamxXFxJMMMy7PTTDQNsQ=
github.com/ipfs/go-ipfs-blockstore v1.3.0/go.mod h1:KgtZyc9fq+P2xJUiCAzbRdhhqJHvsw8u2Dlqy2MyRTE= github.com/ipfs/go-ipfs-blockstore v1.3.1/go.mod h1:KgtZyc9fq+P2xJUiCAzbRdhhqJHvsw8u2Dlqy2MyRTE=
github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= github.com/ipfs/go-ipfs-ds-help v1.1.1 h1:B5UJOH52IbcfS56+Ul+sv8jnIV10lbjLF5eOO0C66Nw=
github.com/ipfs/go-ipfs-ds-help v1.1.0 h1:yLE2w9RAsl31LtfMt91tRZcrx+e61O5mDxFRR994w4Q= github.com/ipfs/go-ipfs-ds-help v1.1.1/go.mod h1:75vrVCkSdSFidJscs8n4W+77AtTpCIAdDGAwjitJMIo=
github.com/ipfs/go-ipfs-ds-help v1.1.0/go.mod h1:YR5+6EaebOhfcqVCyqemItCLthrpVNot+rsOU/5IatU= github.com/ipfs/go-ipfs-util v0.0.3 h1:2RFdGez6bu2ZlZdI+rWfIdbQb1KudQp3VGwPtdNCmE0=
github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= github.com/ipfs/go-ipfs-util v0.0.3/go.mod h1:LHzG1a0Ig4G+iZ26UUOMjHd+lfM84LZCrn17xAKWBvs=
github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= github.com/ipfs/go-ipld-cbor v0.1.0 h1:dx0nS0kILVivGhfWuB6dUpMa/LAwElHPw1yOGYopoYs=
github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= github.com/ipfs/go-ipld-cbor v0.1.0/go.mod h1:U2aYlmVrJr2wsUBU67K4KgepApSZddGRDWBYR0H4sCk=
github.com/ipfs/go-ipld-cbor v0.0.7-0.20230126201833-a73d038d90bc h1:eUEo764smNy0EVRuMTSmirmuh552Mf2aBjfpDcLnDa8= github.com/ipfs/go-ipld-format v0.6.0 h1:VEJlA2kQ3LqFSIm5Vu6eIlSxD/Ze90xtc4Meten1F5U=
github.com/ipfs/go-ipld-cbor v0.0.7-0.20230126201833-a73d038d90bc/go.mod h1:X7SgEIwC4COC5OWfcepZBWafO5kA1Rmt9ZsLLbhihQk= github.com/ipfs/go-ipld-format v0.6.0/go.mod h1:g4QVMTn3marU3qXchwjpKPKgJv+zF+OlaKMyhJ4LHPg=
github.com/ipfs/go-ipld-format v0.4.0 h1:yqJSaJftjmjc9jEOFYlpkwOLVKv68OD27jFLlSghBlQ=
github.com/ipfs/go-ipld-format v0.4.0/go.mod h1:co/SdBE8h99968X0hViiw1MNlh6fvxxnHpvVLnH7jSM=
github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8=
github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo= github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo=
github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g=
@@ -83,16 +84,16 @@ github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY=
github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI=
github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg=
github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY=
github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c=
github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4=
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk=
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
github.com/jackc/pgx/v5 v5.3.0/go.mod h1:t3JDKnCBlYIc0ewLF0Q7B8MXmoIaBOZj/ic7iHozM/8= github.com/jackc/pgx/v5 v5.3.0/go.mod h1:t3JDKnCBlYIc0ewLF0Q7B8MXmoIaBOZj/ic7iHozM/8=
github.com/jackc/pgx/v5 v5.3.1 h1:Fcr8QJ1ZeLi5zsPZqQeUZhNhxfkkKBOgJuYkJHoBOtU= github.com/jackc/pgx/v5 v5.5.0 h1:NxstgwndsTRy7eq9/kqYc/BZh5w2hHJV86wjvO+1xPw=
github.com/jackc/pgx/v5 v5.3.1/go.mod h1:t3JDKnCBlYIc0ewLF0Q7B8MXmoIaBOZj/ic7iHozM/8= github.com/jackc/pgx/v5 v5.5.0/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA=
github.com/jackc/puddle/v2 v2.2.0/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jackc/puddle/v2 v2.2.0/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk=
github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA=
github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o=
github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4=
@@ -106,25 +107,23 @@ github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/compress v1.16.5 h1:IFV2oUNUzZaz+XyusxpLzpzS8Pt5rh0Z16For/djlyI= github.com/klauspost/compress v1.17.3 h1:qkRjuerhUU1EmXLYGkSH6EZL+vPSxIrYjLNAK4slzwA=
github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/compress v1.17.3/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=
github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=
github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/labstack/echo/v4 v4.10.2 h1:n1jAhnq/elIFTHr1EYpiYtyKgx4RW9ccVgkqByZaN2M= github.com/labstack/echo/v4 v4.11.3 h1:Upyu3olaqSHkCjs1EJJwQ3WId8b8b1hxbogyommKktM=
github.com/labstack/echo/v4 v4.10.2/go.mod h1:OEyqf2//K1DFdE57vw2DRgWY0M7s65IVQO2FzvI4J5k= github.com/labstack/echo/v4 v4.11.3/go.mod h1:UcGuQ8V6ZNRmSweBIJkPvGfwCMIlFmiqrPqiEBfPYws=
github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8= github.com/labstack/gommon v0.4.1 h1:gqEff0p/hTENGMABzezPoPSRtIh1Cvw0ueMOe0/dfOk=
github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= github.com/labstack/gommon v0.4.1/go.mod h1:TyTrpPqxR5KMk8LKVtLmfMjeQ5FEkBYdxLYPw/WfrOM=
github.com/lestrrat-go/blackmagic v1.0.1 h1:lS5Zts+5HIC/8og6cGHb0uCcNCa3OUt1ygh3Qz2Fe80= github.com/lestrrat-go/blackmagic v1.0.1 h1:lS5Zts+5HIC/8og6cGHb0uCcNCa3OUt1ygh3Qz2Fe80=
github.com/lestrrat-go/blackmagic v1.0.1/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU= github.com/lestrrat-go/blackmagic v1.0.1/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU=
github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE= github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE=
@@ -133,26 +132,25 @@ github.com/lestrrat-go/httprc v1.0.4 h1:bAZymwoZQb+Oq8MEbyipag7iSq6YIga8Wj6GOiJG
github.com/lestrrat-go/httprc v1.0.4/go.mod h1:mwwz3JMTPBjHUkkDv/IGJ39aALInZLrhBp0X7KGUZlo= github.com/lestrrat-go/httprc v1.0.4/go.mod h1:mwwz3JMTPBjHUkkDv/IGJ39aALInZLrhBp0X7KGUZlo=
github.com/lestrrat-go/iter v1.0.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzltI= github.com/lestrrat-go/iter v1.0.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzltI=
github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4= github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4=
github.com/lestrrat-go/jwx/v2 v2.0.9 h1:TRX4Q630UXxPVLvP5vGaqVJO7S+0PE6msRZUsFSBoC8= github.com/lestrrat-go/jwx/v2 v2.0.12 h1:3d589+5w/b9b7S3DneICPW16AqTyYXB7VRjgluSDWeA=
github.com/lestrrat-go/jwx/v2 v2.0.9/go.mod h1:K68euYaR95FnL0hIQB8VvzL70vB7pSifbJUydCTPmgM= github.com/lestrrat-go/jwx/v2 v2.0.12/go.mod h1:Mq4KN1mM7bp+5z/W5HS8aCNs5RKZ911G/0y2qUjAQuQ=
github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I=
github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU= github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU=
github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I=
github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mattn/go-sqlite3 v1.14.18 h1:JL0eqdCOq6DJVNPSvArO/bIV9/P7fbGrV00LZHc+5aI=
github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= github.com/mattn/go-sqlite3 v1.14.18/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg=
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k=
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ=
github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U=
github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM=
github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8=
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8=
@@ -165,32 +163,39 @@ github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYg
github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM=
github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0=
github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4=
github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs=
github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc=
github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g=
github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk=
github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U=
github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc=
github.com/multiformats/go-multihash v0.2.1 h1:aem8ZT0VA2nCHHk7bPJ1BjUbHNciqZC/d16Vve9l108= github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U=
github.com/multiformats/go-multihash v0.2.1/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc= github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM=
github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE=
github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8=
github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU=
github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f h1:VXTQfuJj9vKR4TCkEuWIckKvdHFeJH/huIFJ9/cXOB0= github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f h1:VXTQfuJj9vKR4TCkEuWIckKvdHFeJH/huIFJ9/cXOB0=
github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f/go.mod h1:/zvteZs/GwLtCgZ4BL6CBsk9IKIlexP43ObX9AxTqTw= github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f/go.mod h1:/zvteZs/GwLtCgZ4BL6CBsk9IKIlexP43ObX9AxTqTw=
github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q=
github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY=
github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=
github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=
github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM=
github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY=
github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=
github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k=
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys=
github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs= github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs=
github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
@@ -209,39 +214,46 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
github.com/urfave/cli/v2 v2.25.3 h1:VJkt6wvEBOoSjPFQvOkv6iWIrsJyCrKGtCtxXWwmGeY= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs=
github.com/urfave/cli/v2 v2.25.3/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo=
github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0 h1:GDDkbFiaK8jsSDJfjId/PEGEShv6ugrt4kYsC5UIDaQ= github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0 h1:GDDkbFiaK8jsSDJfjId/PEGEShv6ugrt4kYsC5UIDaQ=
github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw=
github.com/whyrusleeping/cbor-gen v0.0.0-20230418232409-daab9ece03a0 h1:XYEgH2nJgsrcrj32p+SAbx6T3s/6QknOXezXtz7kzbg= github.com/whyrusleeping/cbor-gen v0.0.0-20230923211252-36a87e1ba72f h1:SBuSxXJL0/ZJMtTxbXZgHZkThl9dNrzyaNhlyaqscRo=
github.com/whyrusleeping/cbor-gen v0.0.0-20230418232409-daab9ece03a0/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20230923211252-36a87e1ba72f/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ=
github.com/whyrusleeping/go-did v0.0.0-20230301193428-2146016fc220 h1:EO/9z3yDvx1van1/0esdcqhalZZQGRj3I1BPTWr5k3A= github.com/whyrusleeping/go-did v0.0.0-20230824162731-404d1707d5d6 h1:yJ9/LwIGIk/c0CdoavpC9RNSGSruIspSZtxG3Nnldic=
github.com/whyrusleeping/go-did v0.0.0-20230301193428-2146016fc220/go.mod h1:qPtRyexGM5XMHFIfjH+EiA/A/1n2JakWEdMPC53pJAE= github.com/whyrusleeping/go-did v0.0.0-20230824162731-404d1707d5d6/go.mod h1:39U9RRVr4CKbXpXYopWn+FSH5s+vWu6+RmguSPWAq5s=
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU=
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
go.opentelemetry.io/otel v1.15.1 h1:3Iwq3lfRByPaws0f6bU3naAqOR1n5IeDWd9390kWHa8= gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b h1:CzigHMRySiX3drau9C6Q5CAbNIApmLdat5jPMqChvDA=
go.opentelemetry.io/otel v1.15.1/go.mod h1:mHHGEHVDLal6YrKMmk9LqC4a3sF5g+fHfrttQIB1NTc= gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b/go.mod h1:/y/V339mxv2sZmYYR64O07VuCpdNZqCTwO8ZcouTMI8=
go.opentelemetry.io/otel/trace v1.15.1 h1:uXLo6iHJEzDfrNC0L0mNjItIp06SyaBQxu5t3xMlngY= gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02 h1:qwDnMxjkyLmAFgcfgTnfJrmYKWhHnci3GjDqcZp1M3Q=
go.opentelemetry.io/otel/trace v1.15.1/go.mod h1:IWdQG/5N1x7f6YUlmdLeJvH9yxtuJAfc4VW5Agv9r/8= gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02/go.mod h1:JTnUj0mpYiAsuZLmKjTx/ex3AtMowcCgnE7YNyCEP0I=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 h1:pginetY7+onl4qN1vl0xW/V/v6OBZ0vVdH+esuJgvmM=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0/go.mod h1:XiYsayHc36K3EByOO6nbAXnAWbrUxdjUROCEeeROOH8=
go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=
go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=
go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=
go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=
go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=
go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=
go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo=
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
@@ -249,9 +261,8 @@ go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN8
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ=
go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI=
go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=
go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=
golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
@@ -259,9 +270,9 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ= golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA=
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
@@ -278,17 +289,18 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg=
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE=
golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -296,27 +308,29 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q=
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -335,11 +349,13 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU=
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
@@ -351,11 +367,11 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gorm.io/driver/postgres v1.5.0 h1:u2FXTy14l45qc3UeCJ7QaAXZmZfDDv0YrthvmRq1l0U= gorm.io/driver/postgres v1.5.0 h1:u2FXTy14l45qc3UeCJ7QaAXZmZfDDv0YrthvmRq1l0U=
gorm.io/driver/postgres v1.5.0/go.mod h1:FUZXzO+5Uqg5zzwzv4KK49R8lvGIyscBOqYrtI1Ce9A= gorm.io/driver/postgres v1.5.0/go.mod h1:FUZXzO+5Uqg5zzwzv4KK49R8lvGIyscBOqYrtI1Ce9A=
gorm.io/driver/sqlite v1.5.0 h1:zKYbzRCpBrT1bNijRnxLDJWPjVfImGEn0lSnUY5gZ+c= gorm.io/driver/sqlite v1.5.4 h1:IqXwXi8M/ZlPzH/947tn5uik3aYQslP9BVveoax0nV0=
gorm.io/driver/sqlite v1.5.0/go.mod h1:kDMDfntV9u/vuMmz8APHtHF0b4nyBB7sfCieC6G8k8I= gorm.io/driver/sqlite v1.5.4/go.mod h1:qxAuCol+2r6PannQDpOP1FP6ag3mKi4esLnB/jHed+4=
gorm.io/gorm v1.24.7-0.20230306060331-85eaf9eeda11/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= gorm.io/gorm v1.24.7-0.20230306060331-85eaf9eeda11/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
gorm.io/gorm v1.25.0 h1:+KtYtb2roDz14EQe4bla8CbQlmb9dN3VejSai3lprfU= gorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=
gorm.io/gorm v1.25.0/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= gorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0= lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI=
lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k=
+1
View File
@@ -8,6 +8,7 @@
<meta property="og:title" content="Bluesky Social"> <meta property="og:title" content="Bluesky Social">
<meta property="og:description" content="See what's next."> <meta property="og:description" content="See what's next.">
<meta property="og:image" content="/static/social-card-default.png"> <meta property="og:image" content="/static/social-card-default.png">
<meta property="og:site_name" content="Bluesky Social">
<meta name="twitter:card" content="summary"> <meta name="twitter:card" content="summary">
<meta name="twitter:site" content="@bluesky"> <meta name="twitter:site" content="@bluesky">
{%- endblock %} {%- endblock %}
+7 -3
View File
@@ -10,8 +10,9 @@
{% block html_head_extra -%} {% block html_head_extra -%}
{%- if postView -%} {%- if postView -%}
<meta property="og:type" content="website">
<meta property="og:site_name" content="Bluesky Social"> <meta property="og:site_name" content="Bluesky Social">
<meta property="og:type" content="article">
<meta property="profile:username" content="{{ profileView.Handle }}">
{%- if requestURI %} {%- if requestURI %}
<meta property="og:url" content="{{ requestURI }}"> <meta property="og:url" content="{{ requestURI }}">
{% endif -%} {% endif -%}
@@ -32,17 +33,20 @@
<meta name="twitter:card" content="summary"> <meta name="twitter:card" content="summary">
{% endif %} {% endif %}
<meta name="twitter:label1" content="Posted At"> <meta name="twitter:label1" content="Posted At">
<meta name="twitter:value1" content="{{ postView.CreatedAt }}"> <meta name="twitter:value1" content="{{ postView.IndexedAt }}">
<meta name="twitter:site" content="@bluesky"> <meta name="article:published_time" content="{{ postView.IndexedAt }}">
{% endif -%} {% endif -%}
{%- endblock %} {%- endblock %}
{% block noscript_extra -%} {% block noscript_extra -%}
{%- if postView -%}
<div id="bsky_post_summary"> <div id="bsky_post_summary">
<h3>Post</h3> <h3>Post</h3>
<p id="bsky_display_name">{{ postView.Author.DisplayName }}</p> <p id="bsky_display_name">{{ postView.Author.DisplayName }}</p>
<p id="bsky_handle">{{ postView.Author.Handle }}</p> <p id="bsky_handle">{{ postView.Author.Handle }}</p>
<p id="bsky_did">{{ postView.Author.Did }}</p> <p id="bsky_did">{{ postView.Author.Did }}</p>
<p id="bsky_post_text">{{ postView.Record.Val.Text }}</p> <p id="bsky_post_text">{{ postView.Record.Val.Text }}</p>
<p id="bsky_post_indexedat">{{ postView.IndexedAt }}</p>
</div> </div>
{% endif -%}
{%- endblock %} {%- endblock %}
+5 -2
View File
@@ -10,8 +10,9 @@
{% block html_head_extra -%} {% block html_head_extra -%}
{%- if profileView -%} {%- if profileView -%}
<meta property="og:type" content="website">
<meta property="og:site_name" content="Bluesky Social"> <meta property="og:site_name" content="Bluesky Social">
<meta property="og:type" content="profile">
<meta property="profile:username" content="{{ profileView.Handle }}">
{%- if requestURI %} {%- if requestURI %}
<meta property="og:url" content="{{ requestURI }}"> <meta property="og:url" content="{{ requestURI }}">
{% endif -%} {% endif -%}
@@ -33,11 +34,12 @@
{% endif %} {% endif %}
<meta name="twitter:label1" content="Account DID"> <meta name="twitter:label1" content="Account DID">
<meta name="twitter:value1" content="{{ profileView.Did }}"> <meta name="twitter:value1" content="{{ profileView.Did }}">
<meta name="twitter:site" content="@bluesky"> <link rel="alternate" type="application/rss+xml" href="/profile/{{ profileView.Did }}/rss">
{% endif -%} {% endif -%}
{%- endblock %} {%- endblock %}
{% block noscript_extra -%} {% block noscript_extra -%}
{%- if profileView -%}
<div id="bsky_profile_summary"> <div id="bsky_profile_summary">
<h3>Profile</h3> <h3>Profile</h3>
<p id="bsky_display_name">{{ profileView.DisplayName }}</p> <p id="bsky_display_name">{{ profileView.DisplayName }}</p>
@@ -45,4 +47,5 @@
<p id="bsky_did">{{ profileView.Did }}</p> <p id="bsky_did">{{ profileView.Did }}</p>
<p id="bsky_profile_description">{{ profileView.Description }}</p> <p id="bsky_profile_description">{{ profileView.Description }}</p>
</div> </div>
{% endif -%}
{%- endblock %} {%- endblock %}
@@ -111,3 +111,9 @@ export function Welcome() {
return <div>{welcome}</div>; return <div>{welcome}</div>;
} }
``` ```
### Credits
Please check each individual `messages.po` file for the credits of the translators. We are very grateful for their help!
If you would like to translate the Bluesky app into your language, please open a PR or issue on this repo.
+1 -1
View File
@@ -78,7 +78,7 @@ export async function createServer(
}) })
const pic = fs.readFileSync( const pic = fs.readFileSync(
path.join(__dirname, '..', 'assets', 'default-avatar.jpg'), path.join(__dirname, '..', 'assets', 'default-avatar.png'),
) )
return { return {
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "bsky.app", "name": "bsky.app",
"version": "1.59.0", "version": "1.60.0",
"private": true, "private": true,
"scripts": { "scripts": {
"prepare": "is-ci || husky install", "prepare": "is-ci || husky install",
+7 -3
View File
@@ -292,7 +292,11 @@ function HomeTabNavigator() {
animationDuration: 250, animationDuration: 250,
contentStyle, contentStyle,
}}> }}>
<HomeTab.Screen name="Home" getComponent={() => HomeScreen} /> <HomeTab.Screen
name="Home"
getComponent={() => HomeScreen}
options={{requireAuth: true}}
/>
{commonScreens(HomeTab)} {commonScreens(HomeTab)}
</HomeTab.Navigator> </HomeTab.Navigator>
) )
@@ -402,7 +406,7 @@ const FlatNavigator = () => {
<Flat.Screen <Flat.Screen
name="Home" name="Home"
getComponent={() => HomeScreen} getComponent={() => HomeScreen}
options={{title: title('Home')}} options={{title: title('Home'), requireAuth: true}}
/> />
<Flat.Screen <Flat.Screen
name="Search" name="Search"
@@ -412,7 +416,7 @@ const FlatNavigator = () => {
<Flat.Screen <Flat.Screen
name="Feeds" name="Feeds"
getComponent={() => FeedsScreen} getComponent={() => FeedsScreen}
options={{title: title('Feeds')}} options={{title: title('Feeds'), requireAuth: true}}
/> />
<Flat.Screen <Flat.Screen
name="Notifications" name="Notifications"
+41 -24
View File
@@ -1,7 +1,7 @@
import React, {useCallback, useEffect} from 'react' import React, {useCallback, useEffect} from 'react'
import {View, StyleSheet} from 'react-native' import {View, StyleSheet, Image as RNImage} from 'react-native'
import * as SplashScreen from 'expo-splash-screen' import * as SplashScreen from 'expo-splash-screen'
import LinearGradient from 'react-native-linear-gradient' import {Image} from 'expo-image'
import Animated, { import Animated, {
interpolate, interpolate,
runOnJS, runOnJS,
@@ -14,6 +14,10 @@ import MaskedView from '@react-native-masked-view/masked-view'
import {useSafeAreaInsets} from 'react-native-safe-area-context' import {useSafeAreaInsets} from 'react-native-safe-area-context'
import Svg, {Path, SvgProps} from 'react-native-svg' import Svg, {Path, SvgProps} from 'react-native-svg'
// @ts-ignore
import splashImagePointer from '../assets/splash.png'
const splashImageUri = RNImage.resolveAssetSource(splashImagePointer).uri
export const Logo = React.forwardRef(function LogoImpl(props: SvgProps, ref) { export const Logo = React.forwardRef(function LogoImpl(props: SvgProps, ref) {
const width = 1000 const width = 1000
const height = width * (67 / 64) const height = width * (67 / 64)
@@ -45,7 +49,10 @@ export function Splash(props: React.PropsWithChildren<Props>) {
const intro = useSharedValue(0) const intro = useSharedValue(0)
const outroLogo = useSharedValue(0) const outroLogo = useSharedValue(0)
const outroApp = useSharedValue(0) const outroApp = useSharedValue(0)
const outroAppOpacity = useSharedValue(0)
const [isAnimationComplete, setIsAnimationComplete] = React.useState(false) const [isAnimationComplete, setIsAnimationComplete] = React.useState(false)
const [isImageLoaded, setIsImageLoaded] = React.useState(false)
const isReady = props.isReady && isImageLoaded
const logoAnimations = useAnimatedStyle(() => { const logoAnimations = useAnimatedStyle(() => {
return { return {
@@ -56,8 +63,8 @@ export function Splash(props: React.PropsWithChildren<Props>) {
{ {
scale: interpolate( scale: interpolate(
outroLogo.value, outroLogo.value,
[0, 0.06, 0.08, 1], [0, 0.08, 1],
[1, 0.8, 0.8, 800], [1, 0.8, 400],
'clamp', 'clamp',
), ),
}, },
@@ -70,29 +77,32 @@ export function Splash(props: React.PropsWithChildren<Props>) {
return { return {
transform: [ transform: [
{ {
scale: interpolate( scale: interpolate(outroApp.value, [0, 1], [1.1, 1], 'clamp'),
outroApp.value,
[0, 0.7, 1],
[1.1, 1.1, 1],
'clamp',
),
}, },
], ],
opacity: interpolate(outroApp.value, [0, 0.7, 1], [0, 0, 1], 'clamp'), opacity: interpolate(
outroAppOpacity.value,
[0, 0.08, 0.15, 1],
[0, 0, 1, 1],
'clamp',
),
} }
}) })
const onFinish = useCallback(() => setIsAnimationComplete(true), []) const onFinish = useCallback(() => setIsAnimationComplete(true), [])
useEffect(() => { useEffect(() => {
if (props.isReady) { if (isReady) {
// hide on mount // hide on mount
SplashScreen.hideAsync().catch(() => {}) SplashScreen.hideAsync().catch(() => {})
intro.value = withTiming( intro.value = withTiming(
1, 1,
{duration: 200, easing: Easing.out(Easing.cubic)}, {duration: 400, easing: Easing.out(Easing.cubic)},
async () => { async () => {
// set these values to check animation at specific point
// outroLogo.value = 0.1
// outroApp.value = 0.1
outroLogo.value = withTiming( outroLogo.value = withTiming(
1, 1,
{duration: 1200, easing: Easing.in(Easing.cubic)}, {duration: 1200, easing: Easing.in(Easing.cubic)},
@@ -100,24 +110,31 @@ export function Splash(props: React.PropsWithChildren<Props>) {
runOnJS(onFinish)() runOnJS(onFinish)()
}, },
) )
outroApp.value = withTiming( outroApp.value = withTiming(1, {
1, duration: 1200,
{duration: 1200, easing: Easing.inOut(Easing.cubic)}, easing: Easing.inOut(Easing.cubic),
() => { })
runOnJS(onFinish)() outroAppOpacity.value = withTiming(1, {
}, duration: 1200,
) easing: Easing.in(Easing.cubic),
})
}, },
) )
} }
}, [onFinish, intro, outroLogo, outroApp, props.isReady]) }, [onFinish, intro, outroLogo, outroApp, outroAppOpacity, isReady])
const onLoadEnd = useCallback(() => {
setIsImageLoaded(true)
}, [setIsImageLoaded])
return ( return (
<View style={{flex: 1}}> <View style={{flex: 1}}>
{!isAnimationComplete && ( {!isAnimationComplete && (
<LinearGradient <Image
colors={['#0A7AFF', '#59B9FF']} accessibilityIgnoresInvertColors
style={[StyleSheet.absoluteFillObject]} onLoadEnd={onLoadEnd}
source={{uri: splashImageUri}}
style={StyleSheet.absoluteFillObject}
/> />
)} )}
-1
View File
@@ -13,7 +13,6 @@ interface TrackPropertiesMap {
'Sign In': {resumedSession: boolean} // CAN BE SERVER 'Sign In': {resumedSession: boolean} // CAN BE SERVER
'Create Account': {} // CAN BE SERVER 'Create Account': {} // CAN BE SERVER
'Try Create Account': {} 'Try Create Account': {}
'Create Account Successfully': {}
'Signin:PressedForgotPassword': {} 'Signin:PressedForgotPassword': {}
'Signin:PressedSelectService': {} 'Signin:PressedSelectService': {}
// COMPOSER / CREATE POST events // COMPOSER / CREATE POST events
+6
View File
@@ -104,12 +104,18 @@ export async function post(agent: BskyAgent, opts: PostOpts) {
// add image embed if present // add image embed if present
if (opts.images?.length) { if (opts.images?.length) {
logger.info(`Uploading images`, {
count: opts.images.length,
})
const images: AppBskyEmbedImages.Image[] = [] const images: AppBskyEmbedImages.Image[] = []
for (const image of opts.images) { for (const image of opts.images) {
opts.onStateChange?.(`Uploading image #${images.length + 1}...`) opts.onStateChange?.(`Uploading image #${images.length + 1}...`)
logger.info(`Compressing image`)
await image.compress() await image.compress()
const path = image.compressed?.path ?? image.path const path = image.compressed?.path ?? image.path
const {width, height} = image.compressed || image const {width, height} = image.compressed || image
logger.info(`Uploading image`)
const res = await uploadBlob(agent, path, 'image/jpeg') const res = await uploadBlob(agent, path, 'image/jpeg')
images.push({ images.push({
image: res.data.blob, image: res.data.blob,
+139 -103
View File
@@ -75,6 +75,10 @@ msgstr ""
#~ msgid "<0>Note: Your profile and posts will remain publicly available. Third-party apps that display Bluesky content may not respect this setting.</0>" #~ msgid "<0>Note: Your profile and posts will remain publicly available. Third-party apps that display Bluesky content may not respect this setting.</0>"
#~ msgstr "" #~ msgstr ""
#: src/view/com/util/moderation/LabelInfo.tsx:45
msgid "A content warning has been applied to this {0}."
msgstr ""
#: src/lib/hooks/useOTAUpdate.ts:16 #: src/lib/hooks/useOTAUpdate.ts:16
msgid "A new version of the app is available. Please update to continue using the app." msgid "A new version of the app is available. Please update to continue using the app."
msgstr "" msgstr ""
@@ -95,7 +99,7 @@ msgstr ""
#: src/view/com/modals/ListAddRemoveUsers.tsx:264 #: src/view/com/modals/ListAddRemoveUsers.tsx:264
#: src/view/com/modals/UserAddRemoveLists.tsx:193 #: src/view/com/modals/UserAddRemoveLists.tsx:193
#: src/view/screens/ProfileList.tsx:753 #: src/view/screens/ProfileList.tsx:754
msgid "Add" msgid "Add"
msgstr "" msgstr ""
@@ -103,7 +107,7 @@ msgstr ""
msgid "Add a content warning" msgid "Add a content warning"
msgstr "" msgstr ""
#: src/view/screens/ProfileList.tsx:743 #: src/view/screens/ProfileList.tsx:744
msgid "Add a user to this list" msgid "Add a user to this list"
msgstr "" msgstr ""
@@ -126,11 +130,11 @@ msgstr ""
msgid "Add details to report" msgid "Add details to report"
msgstr "" msgstr ""
#: src/view/com/composer/Composer.tsx:432 #: src/view/com/composer/Composer.tsx:438
msgid "Add link card" msgid "Add link card"
msgstr "" msgstr ""
#: src/view/com/composer/Composer.tsx:435 #: src/view/com/composer/Composer.tsx:441
msgid "Add link card:" msgid "Add link card:"
msgstr "" msgstr ""
@@ -142,7 +146,7 @@ msgstr ""
msgid "Add to Lists" msgid "Add to Lists"
msgstr "" msgstr ""
#: src/view/screens/ProfileFeed.tsx:275 #: src/view/screens/ProfileFeed.tsx:270
msgid "Add to my feeds" msgid "Add to my feeds"
msgstr "" msgstr ""
@@ -200,15 +204,23 @@ msgstr ""
msgid "App Passwords" msgid "App Passwords"
msgstr "" msgstr ""
#: src/view/com/modals/AppealLabel.tsx:65 #: src/view/com/util/forms/PostDropdownBtn.tsx:207
msgid "Appeal Decision" msgid "Appeal content warning"
msgstr "" msgstr ""
#: src/view/com/util/moderation/LabelInfo.tsx:51 #: src/view/com/modals/AppealLabel.tsx:65
msgid "Appeal Content Warning"
msgstr ""
#: src/view/com/modals/AppealLabel.tsx:65
#~ msgid "Appeal Decision"
#~ msgstr ""
#: src/view/com/util/moderation/LabelInfo.tsx:52
msgid "Appeal this decision" msgid "Appeal this decision"
msgstr "" msgstr ""
#: src/view/com/util/moderation/LabelInfo.tsx:55 #: src/view/com/util/moderation/LabelInfo.tsx:56
msgid "Appeal this decision." msgid "Appeal this decision."
msgstr "" msgstr ""
@@ -224,15 +236,15 @@ msgstr ""
msgid "Are you sure you want to delete the app password \"{name}\"?" msgid "Are you sure you want to delete the app password \"{name}\"?"
msgstr "" msgstr ""
#: src/view/com/composer/Composer.tsx:141 #: src/view/com/composer/Composer.tsx:142
msgid "Are you sure you'd like to discard this draft?" msgid "Are you sure you'd like to discard this draft?"
msgstr "" msgstr ""
#: src/view/screens/ProfileList.tsx:351 #: src/view/screens/ProfileList.tsx:352
msgid "Are you sure?" msgid "Are you sure?"
msgstr "" msgstr ""
#: src/view/com/util/forms/PostDropdownBtn.tsx:188 #: src/view/com/util/forms/PostDropdownBtn.tsx:190
msgid "Are you sure? This cannot be undone." msgid "Are you sure? This cannot be undone."
msgstr "" msgstr ""
@@ -244,7 +256,7 @@ msgstr ""
#~ msgid "Ask apps to limit the visibility of my account" #~ msgid "Ask apps to limit the visibility of my account"
#~ msgstr "" #~ msgstr ""
#: src/view/com/auth/create/CreateAccount.tsx:145 #: src/view/com/auth/create/CreateAccount.tsx:141
#: src/view/com/auth/login/ChooseAccountForm.tsx:151 #: src/view/com/auth/login/ChooseAccountForm.tsx:151
#: src/view/com/auth/login/ForgotPasswordForm.tsx:166 #: src/view/com/auth/login/ForgotPasswordForm.tsx:166
#: src/view/com/auth/login/LoginForm.tsx:249 #: src/view/com/auth/login/LoginForm.tsx:249
@@ -275,15 +287,15 @@ msgstr ""
msgid "Block Account" msgid "Block Account"
msgstr "" msgstr ""
#: src/view/screens/ProfileList.tsx:521 #: src/view/screens/ProfileList.tsx:522
msgid "Block accounts" msgid "Block accounts"
msgstr "" msgstr ""
#: src/view/screens/ProfileList.tsx:471 #: src/view/screens/ProfileList.tsx:472
msgid "Block list" msgid "Block list"
msgstr "" msgstr ""
#: src/view/screens/ProfileList.tsx:306 #: src/view/screens/ProfileList.tsx:307
msgid "Block these accounts?" msgid "Block these accounts?"
msgstr "" msgstr ""
@@ -307,7 +319,7 @@ msgstr ""
msgid "Blocked post." msgid "Blocked post."
msgstr "" msgstr ""
#: src/view/screens/ProfileList.tsx:308 #: src/view/screens/ProfileList.tsx:309
msgid "Blocking is public. Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you." msgid "Blocking is public. Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you."
msgstr "" msgstr ""
@@ -316,7 +328,6 @@ msgid "Blog"
msgstr "" msgstr ""
#: src/view/com/auth/HomeLoggedOutCTA.tsx:31 #: src/view/com/auth/HomeLoggedOutCTA.tsx:31
#: src/view/com/auth/SplashScreen.tsx:26
msgid "Bluesky" msgid "Bluesky"
msgstr "" msgstr ""
@@ -362,8 +373,8 @@ msgstr ""
msgid "Can only contain letters, numbers, spaces, dashes, and underscores. Must be at least 4 characters long, but no more than 32 characters long." msgid "Can only contain letters, numbers, spaces, dashes, and underscores. Must be at least 4 characters long, but no more than 32 characters long."
msgstr "" msgstr ""
#: src/view/com/composer/Composer.tsx:279 #: src/view/com/composer/Composer.tsx:285
#: src/view/com/composer/Composer.tsx:282 #: src/view/com/composer/Composer.tsx:288
#: src/view/com/modals/AltImage.tsx:127 #: src/view/com/modals/AltImage.tsx:127
#: src/view/com/modals/ChangeEmail.tsx:218 #: src/view/com/modals/ChangeEmail.tsx:218
#: src/view/com/modals/ChangeEmail.tsx:220 #: src/view/com/modals/ChangeEmail.tsx:220
@@ -542,7 +553,7 @@ msgstr ""
msgid "Confirmation code" msgid "Confirmation code"
msgstr "" msgstr ""
#: src/view/com/auth/create/CreateAccount.tsx:178 #: src/view/com/auth/create/CreateAccount.tsx:174
#: src/view/com/auth/login/LoginForm.tsx:268 #: src/view/com/auth/login/LoginForm.tsx:268
msgid "Connecting..." msgid "Connecting..."
msgstr "" msgstr ""
@@ -582,11 +593,11 @@ msgstr ""
msgid "Copy" msgid "Copy"
msgstr "" msgstr ""
#: src/view/screens/ProfileList.tsx:383 #: src/view/screens/ProfileList.tsx:384
msgid "Copy link to list" msgid "Copy link to list"
msgstr "" msgstr ""
#: src/view/com/util/forms/PostDropdownBtn.tsx:129 #: src/view/com/util/forms/PostDropdownBtn.tsx:131
msgid "Copy link to post" msgid "Copy link to post"
msgstr "" msgstr ""
@@ -594,7 +605,7 @@ msgstr ""
msgid "Copy link to profile" msgid "Copy link to profile"
msgstr "" msgstr ""
#: src/view/com/util/forms/PostDropdownBtn.tsx:115 #: src/view/com/util/forms/PostDropdownBtn.tsx:117
msgid "Copy post text" msgid "Copy post text"
msgstr "" msgstr ""
@@ -602,25 +613,25 @@ msgstr ""
msgid "Copyright Policy" msgid "Copyright Policy"
msgstr "" msgstr ""
#: src/view/screens/ProfileFeed.tsx:98 #: src/view/screens/ProfileFeed.tsx:94
msgid "Could not load feed" msgid "Could not load feed"
msgstr "" msgstr ""
#: src/view/screens/ProfileList.tsx:829 #: src/view/screens/ProfileList.tsx:830
msgid "Could not load list" msgid "Could not load list"
msgstr "" msgstr ""
#: src/view/com/auth/HomeLoggedOutCTA.tsx:62 #: src/view/com/auth/HomeLoggedOutCTA.tsx:62
#: src/view/com/auth/SplashScreen.tsx:41 #: src/view/com/auth/SplashScreen.tsx:46
msgid "Create a new account" msgid "Create a new account"
msgstr "" msgstr ""
#: src/view/com/auth/create/CreateAccount.tsx:124 #: src/view/com/auth/create/CreateAccount.tsx:120
msgid "Create Account" msgid "Create Account"
msgstr "" msgstr ""
#: src/view/com/auth/HomeLoggedOutCTA.tsx:54 #: src/view/com/auth/HomeLoggedOutCTA.tsx:54
#: src/view/com/auth/SplashScreen.tsx:38 #: src/view/com/auth/SplashScreen.tsx:43
msgid "Create new account" msgid "Create new account"
msgstr "" msgstr ""
@@ -654,8 +665,8 @@ msgstr ""
msgid "Delete app password" msgid "Delete app password"
msgstr "" msgstr ""
#: src/view/screens/ProfileList.tsx:350 #: src/view/screens/ProfileList.tsx:351
#: src/view/screens/ProfileList.tsx:410 #: src/view/screens/ProfileList.tsx:411
msgid "Delete List" msgid "Delete List"
msgstr "" msgstr ""
@@ -667,11 +678,11 @@ msgstr ""
msgid "Delete my account…" msgid "Delete my account…"
msgstr "" msgstr ""
#: src/view/com/util/forms/PostDropdownBtn.tsx:183 #: src/view/com/util/forms/PostDropdownBtn.tsx:185
msgid "Delete post" msgid "Delete post"
msgstr "" msgstr ""
#: src/view/com/util/forms/PostDropdownBtn.tsx:187 #: src/view/com/util/forms/PostDropdownBtn.tsx:189
msgid "Delete this post?" msgid "Delete this post?"
msgstr "" msgstr ""
@@ -694,11 +705,11 @@ msgstr ""
msgid "Developer Tools" msgid "Developer Tools"
msgstr "" msgstr ""
#: src/view/com/composer/Composer.tsx:142 #: src/view/com/composer/Composer.tsx:143
msgid "Discard" msgid "Discard"
msgstr "" msgstr ""
#: src/view/com/composer/Composer.tsx:136 #: src/view/com/composer/Composer.tsx:137
msgid "Discard draft" msgid "Discard draft"
msgstr "" msgstr ""
@@ -750,7 +761,7 @@ msgstr ""
msgid "Edit image" msgid "Edit image"
msgstr "" msgstr ""
#: src/view/screens/ProfileList.tsx:398 #: src/view/screens/ProfileList.tsx:399
msgid "Edit list details" msgid "Edit list details"
msgstr "" msgstr ""
@@ -858,8 +869,8 @@ msgstr ""
#: src/view/screens/Feeds.tsx:475 #: src/view/screens/Feeds.tsx:475
#: src/view/screens/Profile.tsx:164 #: src/view/screens/Profile.tsx:164
#: src/view/shell/bottom-bar/BottomBar.tsx:163 #: src/view/shell/bottom-bar/BottomBar.tsx:181
#: src/view/shell/desktop/LeftNav.tsx:335 #: src/view/shell/desktop/LeftNav.tsx:339
#: src/view/shell/Drawer.tsx:455 #: src/view/shell/Drawer.tsx:455
#: src/view/shell/Drawer.tsx:456 #: src/view/shell/Drawer.tsx:456
msgid "Feeds" msgid "Feeds"
@@ -959,17 +970,17 @@ msgstr ""
msgid "Get Started" msgid "Get Started"
msgstr "" msgstr ""
#: src/view/com/auth/LoggedOut.tsx:70 #: src/view/com/auth/LoggedOut.tsx:81
#: src/view/com/auth/LoggedOut.tsx:71 #: src/view/com/auth/LoggedOut.tsx:82
#: src/view/com/util/moderation/ScreenHider.tsx:123 #: src/view/com/util/moderation/ScreenHider.tsx:123
#: src/view/shell/desktop/LeftNav.tsx:103 #: src/view/shell/desktop/LeftNav.tsx:103
msgid "Go back" msgid "Go back"
msgstr "" msgstr ""
#: src/view/screens/ProfileFeed.tsx:107 #: src/view/screens/ProfileFeed.tsx:103
#: src/view/screens/ProfileFeed.tsx:112 #: src/view/screens/ProfileFeed.tsx:108
#: src/view/screens/ProfileList.tsx:838 #: src/view/screens/ProfileList.tsx:839
#: src/view/screens/ProfileList.tsx:843 #: src/view/screens/ProfileList.tsx:844
msgid "Go Back" msgid "Go Back"
msgstr "" msgstr ""
@@ -1029,14 +1040,14 @@ msgstr ""
#~ msgid "Hmmm, we're having trouble finding this feed. It may have been deleted." #~ msgid "Hmmm, we're having trouble finding this feed. It may have been deleted."
#~ msgstr "" #~ msgstr ""
#: src/view/shell/bottom-bar/BottomBar.tsx:116 #: src/view/shell/bottom-bar/BottomBar.tsx:137
#: src/view/shell/desktop/LeftNav.tsx:297 #: src/view/shell/desktop/LeftNav.tsx:303
#: src/view/shell/Drawer.tsx:379 #: src/view/shell/Drawer.tsx:379
#: src/view/shell/Drawer.tsx:380 #: src/view/shell/Drawer.tsx:380
msgid "Home" msgid "Home"
msgstr "" msgstr ""
#: src/view/com/pager/FeedsTabBarMobile.tsx:99 #: src/view/com/pager/FeedsTabBarMobile.tsx:96
#: src/view/screens/PreferencesHomeFeed.tsx:95 #: src/view/screens/PreferencesHomeFeed.tsx:95
#: src/view/screens/Settings.tsx:481 #: src/view/screens/Settings.tsx:481
msgid "Home Feed Preferences" msgid "Home Feed Preferences"
@@ -1175,7 +1186,7 @@ msgstr ""
#~ msgid "Light" #~ msgid "Light"
#~ msgstr "" #~ msgstr ""
#: src/view/screens/ProfileFeed.tsx:627 #: src/view/screens/ProfileFeed.tsx:577
msgid "Like this feed" msgid "Like this feed"
msgstr "" msgstr ""
@@ -1205,7 +1216,7 @@ msgid "List Name"
msgstr "" msgstr ""
#: src/view/screens/Profile.tsx:165 #: src/view/screens/Profile.tsx:165
#: src/view/shell/desktop/LeftNav.tsx:372 #: src/view/shell/desktop/LeftNav.tsx:376
#: src/view/shell/Drawer.tsx:471 #: src/view/shell/Drawer.tsx:471
#: src/view/shell/Drawer.tsx:472 #: src/view/shell/Drawer.tsx:472
msgid "Lists" msgid "Lists"
@@ -1245,8 +1256,8 @@ msgid "Login to account that is not listed"
msgstr "" msgstr ""
#: src/view/screens/ProfileFeed.tsx:472 #: src/view/screens/ProfileFeed.tsx:472
msgid "Looks like this feed is only available to users with a Bluesky account. Please sign up or sign in to view this feed!" #~ msgid "Looks like this feed is only available to users with a Bluesky account. Please sign up or sign in to view this feed!"
msgstr "" #~ msgstr ""
#: src/view/com/modals/LinkWarning.tsx:63 #: src/view/com/modals/LinkWarning.tsx:63
msgid "Make sure this is where you intend to go!" msgid "Make sure this is where you intend to go!"
@@ -1269,13 +1280,12 @@ msgid "Menu"
msgstr "" msgstr ""
#: src/view/com/posts/FeedErrorMessage.tsx:194 #: src/view/com/posts/FeedErrorMessage.tsx:194
#: src/view/screens/ProfileFeed.tsx:480
msgid "Message from server" msgid "Message from server"
msgstr "" msgstr ""
#: src/view/screens/Moderation.tsx:64 #: src/view/screens/Moderation.tsx:64
#: src/view/screens/Settings.tsx:563 #: src/view/screens/Settings.tsx:563
#: src/view/shell/desktop/LeftNav.tsx:390 #: src/view/shell/desktop/LeftNav.tsx:394
#: src/view/shell/Drawer.tsx:490 #: src/view/shell/Drawer.tsx:490
#: src/view/shell/Drawer.tsx:491 #: src/view/shell/Drawer.tsx:491
msgid "Moderation" msgid "Moderation"
@@ -1294,8 +1304,8 @@ msgid "More feeds"
msgstr "" msgstr ""
#: src/view/com/profile/ProfileHeader.tsx:548 #: src/view/com/profile/ProfileHeader.tsx:548
#: src/view/screens/ProfileFeed.tsx:365 #: src/view/screens/ProfileFeed.tsx:360
#: src/view/screens/ProfileList.tsx:582 #: src/view/screens/ProfileList.tsx:583
msgid "More options" msgid "More options"
msgstr "" msgstr ""
@@ -1307,19 +1317,19 @@ msgstr ""
msgid "Mute Account" msgid "Mute Account"
msgstr "" msgstr ""
#: src/view/screens/ProfileList.tsx:509 #: src/view/screens/ProfileList.tsx:510
msgid "Mute accounts" msgid "Mute accounts"
msgstr "" msgstr ""
#: src/view/screens/ProfileList.tsx:456 #: src/view/screens/ProfileList.tsx:457
msgid "Mute list" msgid "Mute list"
msgstr "" msgstr ""
#: src/view/screens/ProfileList.tsx:269 #: src/view/screens/ProfileList.tsx:270
msgid "Mute these accounts?" msgid "Mute these accounts?"
msgstr "" msgstr ""
#: src/view/com/util/forms/PostDropdownBtn.tsx:147 #: src/view/com/util/forms/PostDropdownBtn.tsx:149
msgid "Mute thread" msgid "Mute thread"
msgstr "" msgstr ""
@@ -1335,7 +1345,7 @@ msgstr ""
msgid "Muted accounts have their posts removed from your feed and from your notifications. Mutes are completely private." msgid "Muted accounts have their posts removed from your feed and from your notifications. Mutes are completely private."
msgstr "" msgstr ""
#: src/view/screens/ProfileList.tsx:271 #: src/view/screens/ProfileList.tsx:272
msgid "Muting is private. Muted accounts can interact with you, but you will not see their posts or receive notifications from them." msgid "Muting is private. Muted accounts can interact with you, but you will not see their posts or receive notifications from them."
msgstr "" msgstr ""
@@ -1376,9 +1386,9 @@ msgstr ""
#: src/view/com/feeds/FeedPage.tsx:200 #: src/view/com/feeds/FeedPage.tsx:200
#: src/view/screens/Feeds.tsx:510 #: src/view/screens/Feeds.tsx:510
#: src/view/screens/Profile.tsx:353 #: src/view/screens/Profile.tsx:353
#: src/view/screens/ProfileFeed.tsx:441 #: src/view/screens/ProfileFeed.tsx:430
#: src/view/screens/ProfileList.tsx:192 #: src/view/screens/ProfileList.tsx:193
#: src/view/screens/ProfileList.tsx:220 #: src/view/screens/ProfileList.tsx:221
#: src/view/shell/desktop/LeftNav.tsx:246 #: src/view/shell/desktop/LeftNav.tsx:246
msgid "New post" msgid "New post"
msgstr "" msgstr ""
@@ -1387,7 +1397,7 @@ msgstr ""
msgid "New Post" msgid "New Post"
msgstr "" msgstr ""
#: src/view/com/auth/create/CreateAccount.tsx:158 #: src/view/com/auth/create/CreateAccount.tsx:154
#: src/view/com/auth/login/ForgotPasswordForm.tsx:174 #: src/view/com/auth/login/ForgotPasswordForm.tsx:174
#: src/view/com/auth/login/ForgotPasswordForm.tsx:184 #: src/view/com/auth/login/ForgotPasswordForm.tsx:184
#: src/view/com/auth/login/LoginForm.tsx:281 #: src/view/com/auth/login/LoginForm.tsx:281
@@ -1407,8 +1417,8 @@ msgstr ""
msgid "No" msgid "No"
msgstr "" msgstr ""
#: src/view/screens/ProfileFeed.tsx:620 #: src/view/screens/ProfileFeed.tsx:570
#: src/view/screens/ProfileList.tsx:710 #: src/view/screens/ProfileList.tsx:711
msgid "No description" msgid "No description"
msgstr "" msgstr ""
@@ -1459,8 +1469,8 @@ msgstr ""
#: src/view/screens/Notifications.tsx:109 #: src/view/screens/Notifications.tsx:109
#: src/view/screens/Notifications.tsx:133 #: src/view/screens/Notifications.tsx:133
#: src/view/shell/bottom-bar/BottomBar.tsx:187 #: src/view/shell/bottom-bar/BottomBar.tsx:205
#: src/view/shell/desktop/LeftNav.tsx:354 #: src/view/shell/desktop/LeftNav.tsx:358
#: src/view/shell/Drawer.tsx:416 #: src/view/shell/Drawer.tsx:416
#: src/view/shell/Drawer.tsx:417 #: src/view/shell/Drawer.tsx:417
msgid "Notifications" msgid "Notifications"
@@ -1474,7 +1484,7 @@ msgstr ""
msgid "Okay" msgid "Okay"
msgstr "" msgstr ""
#: src/view/com/composer/Composer.tsx:348 #: src/view/com/composer/Composer.tsx:354
msgid "One or more images is missing alt text." msgid "One or more images is missing alt text."
msgstr "" msgstr ""
@@ -1482,7 +1492,7 @@ msgstr ""
msgid "Only {0} can reply." msgid "Only {0} can reply."
msgstr "" msgstr ""
#: src/view/com/pager/FeedsTabBarMobile.tsx:79 #: src/view/com/pager/FeedsTabBarMobile.tsx:76
msgid "Open navigation" msgid "Open navigation"
msgstr "" msgstr ""
@@ -1594,12 +1604,17 @@ msgstr ""
#: src/view/com/modals/AppealLabel.tsx:72 #: src/view/com/modals/AppealLabel.tsx:72
#: src/view/com/modals/AppealLabel.tsx:75 #: src/view/com/modals/AppealLabel.tsx:75
msgid "Please tell us why you think this decision was incorrect." msgid "Please tell us why you think this content warning was incorrectly applied!"
msgstr "" msgstr ""
#: src/view/com/composer/Composer.tsx:331 #: src/view/com/modals/AppealLabel.tsx:72
#: src/view/com/modals/AppealLabel.tsx:75
#~ msgid "Please tell us why you think this decision was incorrect."
#~ msgstr ""
#: src/view/com/composer/Composer.tsx:337
#: src/view/com/post-thread/PostThread.tsx:226 #: src/view/com/post-thread/PostThread.tsx:226
#: src/view/screens/PostThread.tsx:78 #: src/view/screens/PostThread.tsx:80
msgid "Post" msgid "Post"
msgstr "" msgstr ""
@@ -1651,7 +1666,8 @@ msgstr ""
msgid "Processing..." msgid "Processing..."
msgstr "" msgstr ""
#: src/view/shell/bottom-bar/BottomBar.tsx:229 #: src/view/shell/bottom-bar/BottomBar.tsx:247
#: src/view/shell/desktop/LeftNav.tsx:412
#: src/view/shell/Drawer.tsx:69 #: src/view/shell/Drawer.tsx:69
#: src/view/shell/Drawer.tsx:525 #: src/view/shell/Drawer.tsx:525
#: src/view/shell/Drawer.tsx:526 #: src/view/shell/Drawer.tsx:526
@@ -1718,7 +1734,7 @@ msgstr ""
#: src/view/com/feeds/FeedSourceCard.tsx:105 #: src/view/com/feeds/FeedSourceCard.tsx:105
#: src/view/com/feeds/FeedSourceCard.tsx:172 #: src/view/com/feeds/FeedSourceCard.tsx:172
#: src/view/screens/ProfileFeed.tsx:275 #: src/view/screens/ProfileFeed.tsx:270
msgid "Remove from my feeds" msgid "Remove from my feeds"
msgstr "" msgstr ""
@@ -1763,16 +1779,16 @@ msgstr ""
msgid "Report Account" msgid "Report Account"
msgstr "" msgstr ""
#: src/view/screens/ProfileFeed.tsx:295 #: src/view/screens/ProfileFeed.tsx:290
msgid "Report feed" msgid "Report feed"
msgstr "" msgstr ""
#: src/view/screens/ProfileList.tsx:424 #: src/view/screens/ProfileList.tsx:425
msgid "Report List" msgid "Report List"
msgstr "" msgstr ""
#: src/view/com/modals/report/SendReportButton.tsx:37 #: src/view/com/modals/report/SendReportButton.tsx:37
#: src/view/com/util/forms/PostDropdownBtn.tsx:165 #: src/view/com/util/forms/PostDropdownBtn.tsx:167
msgid "Report post" msgid "Report post"
msgstr "" msgstr ""
@@ -1830,8 +1846,8 @@ msgstr ""
msgid "Resets the preferences state" msgid "Resets the preferences state"
msgstr "" msgstr ""
#: src/view/com/auth/create/CreateAccount.tsx:163
#: src/view/com/auth/create/CreateAccount.tsx:167 #: src/view/com/auth/create/CreateAccount.tsx:167
#: src/view/com/auth/create/CreateAccount.tsx:171
#: src/view/com/auth/login/LoginForm.tsx:258 #: src/view/com/auth/login/LoginForm.tsx:258
#: src/view/com/auth/login/LoginForm.tsx:261 #: src/view/com/auth/login/LoginForm.tsx:261
#: src/view/com/util/error/ErrorMessage.tsx:55 #: src/view/com/util/error/ErrorMessage.tsx:55
@@ -1881,8 +1897,8 @@ msgstr ""
#: src/view/com/util/forms/SearchInput.tsx:64 #: src/view/com/util/forms/SearchInput.tsx:64
#: src/view/screens/Search/Search.tsx:401 #: src/view/screens/Search/Search.tsx:401
#: src/view/screens/Search/Search.tsx:567 #: src/view/screens/Search/Search.tsx:567
#: src/view/shell/bottom-bar/BottomBar.tsx:138 #: src/view/shell/bottom-bar/BottomBar.tsx:159
#: src/view/shell/desktop/LeftNav.tsx:315 #: src/view/shell/desktop/LeftNav.tsx:321
#: src/view/shell/desktop/Search.tsx:161 #: src/view/shell/desktop/Search.tsx:161
#: src/view/shell/desktop/Search.tsx:170 #: src/view/shell/desktop/Search.tsx:170
#: src/view/shell/Drawer.tsx:343 #: src/view/shell/Drawer.tsx:343
@@ -1894,12 +1910,16 @@ msgstr ""
#~ msgid "Search for posts and users." #~ msgid "Search for posts and users."
#~ msgstr "" #~ msgstr ""
#: src/view/com/auth/LoggedOut.tsx:104
#: src/view/com/auth/LoggedOut.tsx:105
msgid "Search for users"
msgstr ""
#: src/view/com/modals/ChangeEmail.tsx:110 #: src/view/com/modals/ChangeEmail.tsx:110
msgid "Security Step Required" msgid "Security Step Required"
msgstr "" msgstr ""
#: src/view/com/auth/HomeLoggedOutCTA.tsx:39 #: src/view/com/auth/HomeLoggedOutCTA.tsx:39
#: src/view/com/auth/SplashScreen.tsx:29
msgid "See what's next" msgid "See what's next"
msgstr "" msgstr ""
@@ -1973,7 +1993,7 @@ msgid "Set this setting to \"Yes\" to show samples of your saved feeds in your f
msgstr "" msgstr ""
#: src/view/screens/Settings.tsx:277 #: src/view/screens/Settings.tsx:277
#: src/view/shell/desktop/LeftNav.tsx:426 #: src/view/shell/desktop/LeftNav.tsx:430
#: src/view/shell/Drawer.tsx:546 #: src/view/shell/Drawer.tsx:546
#: src/view/shell/Drawer.tsx:547 #: src/view/shell/Drawer.tsx:547
msgid "Settings" msgid "Settings"
@@ -1984,12 +2004,12 @@ msgid "Sexual activity or erotic nudity."
msgstr "" msgstr ""
#: src/view/com/profile/ProfileHeader.tsx:338 #: src/view/com/profile/ProfileHeader.tsx:338
#: src/view/com/util/forms/PostDropdownBtn.tsx:129 #: src/view/com/util/forms/PostDropdownBtn.tsx:131
#: src/view/screens/ProfileList.tsx:383 #: src/view/screens/ProfileList.tsx:384
msgid "Share" msgid "Share"
msgstr "" msgstr ""
#: src/view/screens/ProfileFeed.tsx:307 #: src/view/screens/ProfileFeed.tsx:302
msgid "Share feed" msgid "Share feed"
msgstr "" msgstr ""
@@ -2032,15 +2052,21 @@ msgstr ""
#: src/view/com/auth/HomeLoggedOutCTA.tsx:70 #: src/view/com/auth/HomeLoggedOutCTA.tsx:70
#: src/view/com/auth/login/Login.tsx:98 #: src/view/com/auth/login/Login.tsx:98
#: src/view/com/auth/SplashScreen.tsx:49 #: src/view/com/auth/SplashScreen.tsx:54
#: src/view/shell/bottom-bar/BottomBar.tsx:285
#: src/view/shell/bottom-bar/BottomBar.tsx:286
#: src/view/shell/bottom-bar/BottomBar.tsx:288
#: src/view/shell/bottom-bar/BottomBarWeb.tsx:177
#: src/view/shell/bottom-bar/BottomBarWeb.tsx:178
#: src/view/shell/bottom-bar/BottomBarWeb.tsx:180
#: src/view/shell/NavSignupCard.tsx:58 #: src/view/shell/NavSignupCard.tsx:58
#: src/view/shell/NavSignupCard.tsx:59 #: src/view/shell/NavSignupCard.tsx:59
msgid "Sign in" msgid "Sign in"
msgstr "" msgstr ""
#: src/view/com/auth/HomeLoggedOutCTA.tsx:78 #: src/view/com/auth/HomeLoggedOutCTA.tsx:78
#: src/view/com/auth/SplashScreen.tsx:52 #: src/view/com/auth/SplashScreen.tsx:57
#: src/view/com/auth/SplashScreen.web.tsx:84 #: src/view/com/auth/SplashScreen.web.tsx:87
msgid "Sign In" msgid "Sign In"
msgstr "" msgstr ""
@@ -2062,6 +2088,12 @@ msgstr ""
msgid "Sign out" msgid "Sign out"
msgstr "" msgstr ""
#: src/view/shell/bottom-bar/BottomBar.tsx:275
#: src/view/shell/bottom-bar/BottomBar.tsx:276
#: src/view/shell/bottom-bar/BottomBar.tsx:278
#: src/view/shell/bottom-bar/BottomBarWeb.tsx:167
#: src/view/shell/bottom-bar/BottomBarWeb.tsx:168
#: src/view/shell/bottom-bar/BottomBarWeb.tsx:170
#: src/view/shell/NavSignupCard.tsx:49 #: src/view/shell/NavSignupCard.tsx:49
#: src/view/shell/NavSignupCard.tsx:50 #: src/view/shell/NavSignupCard.tsx:50
#: src/view/shell/NavSignupCard.tsx:52 #: src/view/shell/NavSignupCard.tsx:52
@@ -2113,11 +2145,11 @@ msgstr ""
msgid "Submit" msgid "Submit"
msgstr "Submit" msgstr "Submit"
#: src/view/screens/ProfileList.tsx:573 #: src/view/screens/ProfileList.tsx:574
msgid "Subscribe" msgid "Subscribe"
msgstr "" msgstr ""
#: src/view/screens/ProfileList.tsx:569 #: src/view/screens/ProfileList.tsx:570
msgid "Subscribe to this list" msgid "Subscribe to this list"
msgstr "" msgstr ""
@@ -2192,8 +2224,8 @@ msgid "There was an unexpected issue in the application. Please let us know if t
msgstr "" msgstr ""
#: src/view/com/util/moderation/LabelInfo.tsx:45 #: src/view/com/util/moderation/LabelInfo.tsx:45
msgid "This {0} has been labeled." #~ msgid "This {0} has been labeled."
msgstr "" #~ msgstr ""
#: src/view/com/util/moderation/ScreenHider.tsx:88 #: src/view/com/util/moderation/ScreenHider.tsx:88
msgid "This {screenDescription} has been flagged:" msgid "This {screenDescription} has been flagged:"
@@ -2227,7 +2259,7 @@ msgstr ""
msgid "This link is taking you to the following website:" msgid "This link is taking you to the following website:"
msgstr "" msgstr ""
#: src/view/com/post-thread/PostThreadItem.tsx:124 #: src/view/com/post-thread/PostThreadItem.tsx:123
msgid "This post has been deleted." msgid "This post has been deleted."
msgstr "" msgstr ""
@@ -2252,9 +2284,9 @@ msgstr ""
msgid "Transformations" msgid "Transformations"
msgstr "" msgstr ""
#: src/view/com/post-thread/PostThreadItem.tsx:704
#: src/view/com/post-thread/PostThreadItem.tsx:706 #: src/view/com/post-thread/PostThreadItem.tsx:706
#: src/view/com/post-thread/PostThreadItem.tsx:708 #: src/view/com/util/forms/PostDropdownBtn.tsx:103
#: src/view/com/util/forms/PostDropdownBtn.tsx:101
msgid "Translate" msgid "Translate"
msgstr "" msgstr ""
@@ -2262,11 +2294,11 @@ msgstr ""
msgid "Try again" msgid "Try again"
msgstr "" msgstr ""
#: src/view/screens/ProfileList.tsx:471 #: src/view/screens/ProfileList.tsx:472
msgid "Un-block list" msgid "Un-block list"
msgstr "" msgstr ""
#: src/view/screens/ProfileList.tsx:456 #: src/view/screens/ProfileList.tsx:457
msgid "Un-mute list" msgid "Un-mute list"
msgstr "" msgstr ""
@@ -2298,11 +2330,11 @@ msgstr ""
msgid "Unmute Account" msgid "Unmute Account"
msgstr "" msgstr ""
#: src/view/com/util/forms/PostDropdownBtn.tsx:147 #: src/view/com/util/forms/PostDropdownBtn.tsx:149
msgid "Unmute thread" msgid "Unmute thread"
msgstr "" msgstr ""
#: src/view/screens/ProfileList.tsx:439 #: src/view/screens/ProfileList.tsx:440
msgid "Unpin moderation list" msgid "Unpin moderation list"
msgstr "" msgstr ""
@@ -2351,7 +2383,7 @@ msgstr ""
msgid "Username or email address" msgid "Username or email address"
msgstr "" msgstr ""
#: src/view/screens/ProfileList.tsx:737 #: src/view/screens/ProfileList.tsx:738
msgid "Users" msgid "Users"
msgstr "" msgstr ""
@@ -2396,7 +2428,7 @@ msgstr ""
msgid "Visit Site" msgid "Visit Site"
msgstr "" msgstr ""
#: src/view/com/auth/create/CreateAccount.tsx:125 #: src/view/com/auth/create/CreateAccount.tsx:121
msgid "We're so excited to have you join us!" msgid "We're so excited to have you join us!"
msgstr "" msgstr ""
@@ -2424,6 +2456,10 @@ msgstr ""
msgid "What is the issue with this {collectionName}?" msgid "What is the issue with this {collectionName}?"
msgstr "" msgstr ""
#: src/view/com/auth/SplashScreen.tsx:34
msgid "What's up?"
msgstr ""
#: src/view/com/modals/lang-settings/PostLanguagesSettings.tsx:78 #: src/view/com/modals/lang-settings/PostLanguagesSettings.tsx:78
msgid "Which languages are used in this post?" msgid "Which languages are used in this post?"
msgstr "" msgstr ""
@@ -2445,7 +2481,7 @@ msgstr ""
msgid "Wide" msgid "Wide"
msgstr "" msgstr ""
#: src/view/com/composer/Composer.tsx:403 #: src/view/com/composer/Composer.tsx:409
msgid "Write post" msgid "Write post"
msgstr "" msgstr ""
+139 -103
View File
@@ -75,6 +75,10 @@ msgstr "<0>कुछ</0><1>पसंदीदा उपयोगकर्ता
#~ msgid "<0>Note: Your profile and posts will remain publicly available. Third-party apps that display Bluesky content may not respect this setting.</0>" #~ msgid "<0>Note: Your profile and posts will remain publicly available. Third-party apps that display Bluesky content may not respect this setting.</0>"
#~ msgstr "" #~ msgstr ""
#: src/view/com/util/moderation/LabelInfo.tsx:45
msgid "A content warning has been applied to this {0}."
msgstr ""
#: src/lib/hooks/useOTAUpdate.ts:16 #: src/lib/hooks/useOTAUpdate.ts:16
msgid "A new version of the app is available. Please update to continue using the app." msgid "A new version of the app is available. Please update to continue using the app."
msgstr "ऐप का एक नया संस्करण उपलब्ध है. कृपया ऐप का उपयोग जारी रखने के लिए अपडेट करें।" msgstr "ऐप का एक नया संस्करण उपलब्ध है. कृपया ऐप का उपयोग जारी रखने के लिए अपडेट करें।"
@@ -95,7 +99,7 @@ msgstr "अकाउंट के विकल्प"
#: src/view/com/modals/ListAddRemoveUsers.tsx:264 #: src/view/com/modals/ListAddRemoveUsers.tsx:264
#: src/view/com/modals/UserAddRemoveLists.tsx:193 #: src/view/com/modals/UserAddRemoveLists.tsx:193
#: src/view/screens/ProfileList.tsx:753 #: src/view/screens/ProfileList.tsx:754
msgid "Add" msgid "Add"
msgstr "ऐड करो" msgstr "ऐड करो"
@@ -103,7 +107,7 @@ msgstr "ऐड करो"
msgid "Add a content warning" msgid "Add a content warning"
msgstr "सामग्री चेतावनी जोड़ें" msgstr "सामग्री चेतावनी जोड़ें"
#: src/view/screens/ProfileList.tsx:743 #: src/view/screens/ProfileList.tsx:744
msgid "Add a user to this list" msgid "Add a user to this list"
msgstr "इस सूची में किसी को जोड़ें" msgstr "इस सूची में किसी को जोड़ें"
@@ -126,11 +130,11 @@ msgstr "विवरण जोड़ें"
msgid "Add details to report" msgid "Add details to report"
msgstr "रिपोर्ट करने के लिए विवरण जोड़ें" msgstr "रिपोर्ट करने के लिए विवरण जोड़ें"
#: src/view/com/composer/Composer.tsx:432 #: src/view/com/composer/Composer.tsx:438
msgid "Add link card" msgid "Add link card"
msgstr "लिंक कार्ड जोड़ें" msgstr "लिंक कार्ड जोड़ें"
#: src/view/com/composer/Composer.tsx:435 #: src/view/com/composer/Composer.tsx:441
msgid "Add link card:" msgid "Add link card:"
msgstr "लिंक कार्ड जोड़ें:" msgstr "लिंक कार्ड जोड़ें:"
@@ -142,7 +146,7 @@ msgstr "अपने डोमेन में निम्नलिखित DN
msgid "Add to Lists" msgid "Add to Lists"
msgstr "सूचियों में जोड़ें" msgstr "सूचियों में जोड़ें"
#: src/view/screens/ProfileFeed.tsx:275 #: src/view/screens/ProfileFeed.tsx:270
msgid "Add to my feeds" msgid "Add to my feeds"
msgstr "इस फ़ीड को सहेजें" msgstr "इस फ़ीड को सहेजें"
@@ -200,15 +204,23 @@ msgstr "ऐप पासवर्ड"
msgid "App Passwords" msgid "App Passwords"
msgstr "ऐप पासवर्ड" msgstr "ऐप पासवर्ड"
#: src/view/com/modals/AppealLabel.tsx:65 #: src/view/com/util/forms/PostDropdownBtn.tsx:207
msgid "Appeal Decision" msgid "Appeal content warning"
msgstr "" msgstr ""
#: src/view/com/util/moderation/LabelInfo.tsx:51 #: src/view/com/modals/AppealLabel.tsx:65
msgid "Appeal Content Warning"
msgstr ""
#: src/view/com/modals/AppealLabel.tsx:65
#~ msgid "Appeal Decision"
#~ msgstr ""
#: src/view/com/util/moderation/LabelInfo.tsx:52
msgid "Appeal this decision" msgid "Appeal this decision"
msgstr "" msgstr ""
#: src/view/com/util/moderation/LabelInfo.tsx:55 #: src/view/com/util/moderation/LabelInfo.tsx:56
msgid "Appeal this decision." msgid "Appeal this decision."
msgstr "" msgstr ""
@@ -224,15 +236,15 @@ msgstr "दिखावट"
msgid "Are you sure you want to delete the app password \"{name}\"?" msgid "Are you sure you want to delete the app password \"{name}\"?"
msgstr "क्या आप वाकई ऐप पासवर्ड \"{name}\" हटाना चाहते हैं?" msgstr "क्या आप वाकई ऐप पासवर्ड \"{name}\" हटाना चाहते हैं?"
#: src/view/com/composer/Composer.tsx:141 #: src/view/com/composer/Composer.tsx:142
msgid "Are you sure you'd like to discard this draft?" msgid "Are you sure you'd like to discard this draft?"
msgstr "क्या आप वाकई इस ड्राफ्ट को हटाना करना चाहेंगे?" msgstr "क्या आप वाकई इस ड्राफ्ट को हटाना करना चाहेंगे?"
#: src/view/screens/ProfileList.tsx:351 #: src/view/screens/ProfileList.tsx:352
msgid "Are you sure?" msgid "Are you sure?"
msgstr "क्या आप वास्तव में इसे करना चाहते हैं?" msgstr "क्या आप वास्तव में इसे करना चाहते हैं?"
#: src/view/com/util/forms/PostDropdownBtn.tsx:188 #: src/view/com/util/forms/PostDropdownBtn.tsx:190
msgid "Are you sure? This cannot be undone." msgid "Are you sure? This cannot be undone."
msgstr "क्या आप वास्तव में इसे करना चाहते हैं? इसे असंपादित नहीं किया जा सकता है।" msgstr "क्या आप वास्तव में इसे करना चाहते हैं? इसे असंपादित नहीं किया जा सकता है।"
@@ -244,7 +256,7 @@ msgstr "कलात्मक या गैर-कामुक नग्नत
#~ msgid "Ask apps to limit the visibility of my account" #~ msgid "Ask apps to limit the visibility of my account"
#~ msgstr "" #~ msgstr ""
#: src/view/com/auth/create/CreateAccount.tsx:145 #: src/view/com/auth/create/CreateAccount.tsx:141
#: src/view/com/auth/login/ChooseAccountForm.tsx:151 #: src/view/com/auth/login/ChooseAccountForm.tsx:151
#: src/view/com/auth/login/ForgotPasswordForm.tsx:166 #: src/view/com/auth/login/ForgotPasswordForm.tsx:166
#: src/view/com/auth/login/LoginForm.tsx:249 #: src/view/com/auth/login/LoginForm.tsx:249
@@ -275,15 +287,15 @@ msgstr "जन्मदिन:"
msgid "Block Account" msgid "Block Account"
msgstr "खाता ब्लॉक करें" msgstr "खाता ब्लॉक करें"
#: src/view/screens/ProfileList.tsx:521 #: src/view/screens/ProfileList.tsx:522
msgid "Block accounts" msgid "Block accounts"
msgstr "खाता ब्लॉक करें" msgstr "खाता ब्लॉक करें"
#: src/view/screens/ProfileList.tsx:471 #: src/view/screens/ProfileList.tsx:472
msgid "Block list" msgid "Block list"
msgstr "" msgstr ""
#: src/view/screens/ProfileList.tsx:306 #: src/view/screens/ProfileList.tsx:307
msgid "Block these accounts?" msgid "Block these accounts?"
msgstr "खाता ब्लॉक करें?" msgstr "खाता ब्लॉक करें?"
@@ -307,7 +319,7 @@ msgstr "अवरुद्ध खाते आपके थ्रेड्स
msgid "Blocked post." msgid "Blocked post."
msgstr "ब्लॉक पोस्ट।" msgstr "ब्लॉक पोस्ट।"
#: src/view/screens/ProfileList.tsx:308 #: src/view/screens/ProfileList.tsx:309
msgid "Blocking is public. Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you." msgid "Blocking is public. Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you."
msgstr "अवरोधन सार्वजनिक है. अवरुद्ध खाते आपके थ्रेड्स में उत्तर नहीं दे सकते, आपका उल्लेख नहीं कर सकते, या अन्यथा आपके साथ बातचीत नहीं कर सकते।" msgstr "अवरोधन सार्वजनिक है. अवरुद्ध खाते आपके थ्रेड्स में उत्तर नहीं दे सकते, आपका उल्लेख नहीं कर सकते, या अन्यथा आपके साथ बातचीत नहीं कर सकते।"
@@ -316,7 +328,6 @@ msgid "Blog"
msgstr "" msgstr ""
#: src/view/com/auth/HomeLoggedOutCTA.tsx:31 #: src/view/com/auth/HomeLoggedOutCTA.tsx:31
#: src/view/com/auth/SplashScreen.tsx:26
msgid "Bluesky" msgid "Bluesky"
msgstr "Bluesky" msgstr "Bluesky"
@@ -362,8 +373,8 @@ msgstr "कैमरा"
msgid "Can only contain letters, numbers, spaces, dashes, and underscores. Must be at least 4 characters long, but no more than 32 characters long." msgid "Can only contain letters, numbers, spaces, dashes, and underscores. Must be at least 4 characters long, but no more than 32 characters long."
msgstr "केवल अक्षर, संख्या, रिक्त स्थान, डैश और अंडरस्कोर हो सकते हैं। कम से कम 4 अक्षर लंबा होना चाहिए, लेकिन 32 अक्षरों से अधिक लंबा नहीं होना चाहिए।।" msgstr "केवल अक्षर, संख्या, रिक्त स्थान, डैश और अंडरस्कोर हो सकते हैं। कम से कम 4 अक्षर लंबा होना चाहिए, लेकिन 32 अक्षरों से अधिक लंबा नहीं होना चाहिए।।"
#: src/view/com/composer/Composer.tsx:279 #: src/view/com/composer/Composer.tsx:285
#: src/view/com/composer/Composer.tsx:282 #: src/view/com/composer/Composer.tsx:288
#: src/view/com/modals/AltImage.tsx:127 #: src/view/com/modals/AltImage.tsx:127
#: src/view/com/modals/ChangeEmail.tsx:218 #: src/view/com/modals/ChangeEmail.tsx:218
#: src/view/com/modals/ChangeEmail.tsx:220 #: src/view/com/modals/ChangeEmail.tsx:220
@@ -538,7 +549,7 @@ msgstr "खाते को हटा दें"
msgid "Confirmation code" msgid "Confirmation code"
msgstr "OTP कोड" msgstr "OTP कोड"
#: src/view/com/auth/create/CreateAccount.tsx:178 #: src/view/com/auth/create/CreateAccount.tsx:174
#: src/view/com/auth/login/LoginForm.tsx:268 #: src/view/com/auth/login/LoginForm.tsx:268
msgid "Connecting..." msgid "Connecting..."
msgstr "कनेक्टिंग ..।" msgstr "कनेक्टिंग ..।"
@@ -578,11 +589,11 @@ msgstr "कॉपी कर ली"
msgid "Copy" msgid "Copy"
msgstr "कॉपी" msgstr "कॉपी"
#: src/view/screens/ProfileList.tsx:383 #: src/view/screens/ProfileList.tsx:384
msgid "Copy link to list" msgid "Copy link to list"
msgstr "" msgstr ""
#: src/view/com/util/forms/PostDropdownBtn.tsx:129 #: src/view/com/util/forms/PostDropdownBtn.tsx:131
msgid "Copy link to post" msgid "Copy link to post"
msgstr "" msgstr ""
@@ -590,7 +601,7 @@ msgstr ""
msgid "Copy link to profile" msgid "Copy link to profile"
msgstr "" msgstr ""
#: src/view/com/util/forms/PostDropdownBtn.tsx:115 #: src/view/com/util/forms/PostDropdownBtn.tsx:117
msgid "Copy post text" msgid "Copy post text"
msgstr "पोस्ट टेक्स्ट कॉपी करें" msgstr "पोस्ट टेक्स्ट कॉपी करें"
@@ -598,25 +609,25 @@ msgstr "पोस्ट टेक्स्ट कॉपी करें"
msgid "Copyright Policy" msgid "Copyright Policy"
msgstr "कॉपीराइट नीति" msgstr "कॉपीराइट नीति"
#: src/view/screens/ProfileFeed.tsx:98 #: src/view/screens/ProfileFeed.tsx:94
msgid "Could not load feed" msgid "Could not load feed"
msgstr "फ़ीड लोड नहीं कर सकता" msgstr "फ़ीड लोड नहीं कर सकता"
#: src/view/screens/ProfileList.tsx:829 #: src/view/screens/ProfileList.tsx:830
msgid "Could not load list" msgid "Could not load list"
msgstr "सूची लोड नहीं कर सकता" msgstr "सूची लोड नहीं कर सकता"
#: src/view/com/auth/HomeLoggedOutCTA.tsx:62 #: src/view/com/auth/HomeLoggedOutCTA.tsx:62
#: src/view/com/auth/SplashScreen.tsx:41 #: src/view/com/auth/SplashScreen.tsx:46
msgid "Create a new account" msgid "Create a new account"
msgstr "नया खाता बनाएं" msgstr "नया खाता बनाएं"
#: src/view/com/auth/create/CreateAccount.tsx:124 #: src/view/com/auth/create/CreateAccount.tsx:120
msgid "Create Account" msgid "Create Account"
msgstr "खाता बनाएँ" msgstr "खाता बनाएँ"
#: src/view/com/auth/HomeLoggedOutCTA.tsx:54 #: src/view/com/auth/HomeLoggedOutCTA.tsx:54
#: src/view/com/auth/SplashScreen.tsx:38 #: src/view/com/auth/SplashScreen.tsx:43
msgid "Create new account" msgid "Create new account"
msgstr "नया खाता बनाएं" msgstr "नया खाता बनाएं"
@@ -650,8 +661,8 @@ msgstr "खाता हटाएं"
msgid "Delete app password" msgid "Delete app password"
msgstr "अप्प पासवर्ड हटाएं" msgstr "अप्प पासवर्ड हटाएं"
#: src/view/screens/ProfileList.tsx:350 #: src/view/screens/ProfileList.tsx:351
#: src/view/screens/ProfileList.tsx:410 #: src/view/screens/ProfileList.tsx:411
msgid "Delete List" msgid "Delete List"
msgstr "सूची हटाएँ" msgstr "सूची हटाएँ"
@@ -663,11 +674,11 @@ msgstr "मेरा खाता हटाएं"
msgid "Delete my account…" msgid "Delete my account…"
msgstr "मेरा खाता हटाएं…" msgstr "मेरा खाता हटाएं…"
#: src/view/com/util/forms/PostDropdownBtn.tsx:183 #: src/view/com/util/forms/PostDropdownBtn.tsx:185
msgid "Delete post" msgid "Delete post"
msgstr "पोस्ट को हटाएं" msgstr "पोस्ट को हटाएं"
#: src/view/com/util/forms/PostDropdownBtn.tsx:187 #: src/view/com/util/forms/PostDropdownBtn.tsx:189
msgid "Delete this post?" msgid "Delete this post?"
msgstr "इस पोस्ट को डीलीट करें?" msgstr "इस पोस्ट को डीलीट करें?"
@@ -690,11 +701,11 @@ msgstr "देव सर्वर"
msgid "Developer Tools" msgid "Developer Tools"
msgstr "डेवलपर उपकरण" msgstr "डेवलपर उपकरण"
#: src/view/com/composer/Composer.tsx:142 #: src/view/com/composer/Composer.tsx:143
msgid "Discard" msgid "Discard"
msgstr "" msgstr ""
#: src/view/com/composer/Composer.tsx:136 #: src/view/com/composer/Composer.tsx:137
msgid "Discard draft" msgid "Discard draft"
msgstr "ड्राफ्ट हटाएं" msgstr "ड्राफ्ट हटाएं"
@@ -746,7 +757,7 @@ msgstr "प्रत्येक कोड एक बार काम करत
msgid "Edit image" msgid "Edit image"
msgstr "छवि संपादित करें" msgstr "छवि संपादित करें"
#: src/view/screens/ProfileList.tsx:398 #: src/view/screens/ProfileList.tsx:399
msgid "Edit list details" msgid "Edit list details"
msgstr "सूची विवरण संपादित करें" msgstr "सूची विवरण संपादित करें"
@@ -854,8 +865,8 @@ msgstr "प्रतिक्रिया"
#: src/view/screens/Feeds.tsx:475 #: src/view/screens/Feeds.tsx:475
#: src/view/screens/Profile.tsx:164 #: src/view/screens/Profile.tsx:164
#: src/view/shell/bottom-bar/BottomBar.tsx:163 #: src/view/shell/bottom-bar/BottomBar.tsx:181
#: src/view/shell/desktop/LeftNav.tsx:335 #: src/view/shell/desktop/LeftNav.tsx:339
#: src/view/shell/Drawer.tsx:455 #: src/view/shell/Drawer.tsx:455
#: src/view/shell/Drawer.tsx:456 #: src/view/shell/Drawer.tsx:456
msgid "Feeds" msgid "Feeds"
@@ -951,17 +962,17 @@ msgstr "गैलरी"
msgid "Get Started" msgid "Get Started"
msgstr "प्रारंभ करें" msgstr "प्रारंभ करें"
#: src/view/com/auth/LoggedOut.tsx:70 #: src/view/com/auth/LoggedOut.tsx:81
#: src/view/com/auth/LoggedOut.tsx:71 #: src/view/com/auth/LoggedOut.tsx:82
#: src/view/com/util/moderation/ScreenHider.tsx:123 #: src/view/com/util/moderation/ScreenHider.tsx:123
#: src/view/shell/desktop/LeftNav.tsx:103 #: src/view/shell/desktop/LeftNav.tsx:103
msgid "Go back" msgid "Go back"
msgstr "वापस जाओ" msgstr "वापस जाओ"
#: src/view/screens/ProfileFeed.tsx:107 #: src/view/screens/ProfileFeed.tsx:103
#: src/view/screens/ProfileFeed.tsx:112 #: src/view/screens/ProfileFeed.tsx:108
#: src/view/screens/ProfileList.tsx:838 #: src/view/screens/ProfileList.tsx:839
#: src/view/screens/ProfileList.tsx:843 #: src/view/screens/ProfileList.tsx:844
msgid "Go Back" msgid "Go Back"
msgstr "वापस जाओ" msgstr "वापस जाओ"
@@ -1021,14 +1032,14 @@ msgstr ""
#~ msgid "Hmmm, we're having trouble finding this feed. It may have been deleted." #~ msgid "Hmmm, we're having trouble finding this feed. It may have been deleted."
#~ msgstr "" #~ msgstr ""
#: src/view/shell/bottom-bar/BottomBar.tsx:116 #: src/view/shell/bottom-bar/BottomBar.tsx:137
#: src/view/shell/desktop/LeftNav.tsx:297 #: src/view/shell/desktop/LeftNav.tsx:303
#: src/view/shell/Drawer.tsx:379 #: src/view/shell/Drawer.tsx:379
#: src/view/shell/Drawer.tsx:380 #: src/view/shell/Drawer.tsx:380
msgid "Home" msgid "Home"
msgstr "होम फीड" msgstr "होम फीड"
#: src/view/com/pager/FeedsTabBarMobile.tsx:99 #: src/view/com/pager/FeedsTabBarMobile.tsx:96
#: src/view/screens/PreferencesHomeFeed.tsx:95 #: src/view/screens/PreferencesHomeFeed.tsx:95
#: src/view/screens/Settings.tsx:481 #: src/view/screens/Settings.tsx:481
msgid "Home Feed Preferences" msgid "Home Feed Preferences"
@@ -1167,7 +1178,7 @@ msgstr "चित्र पुस्तकालय"
#~ msgid "Light" #~ msgid "Light"
#~ msgstr "लाइट मोड" #~ msgstr "लाइट मोड"
#: src/view/screens/ProfileFeed.tsx:627 #: src/view/screens/ProfileFeed.tsx:577
msgid "Like this feed" msgid "Like this feed"
msgstr "इस फ़ीड को लाइक करो" msgstr "इस फ़ीड को लाइक करो"
@@ -1197,7 +1208,7 @@ msgid "List Name"
msgstr "सूची का नाम" msgstr "सूची का नाम"
#: src/view/screens/Profile.tsx:165 #: src/view/screens/Profile.tsx:165
#: src/view/shell/desktop/LeftNav.tsx:372 #: src/view/shell/desktop/LeftNav.tsx:376
#: src/view/shell/Drawer.tsx:471 #: src/view/shell/Drawer.tsx:471
#: src/view/shell/Drawer.tsx:472 #: src/view/shell/Drawer.tsx:472
msgid "Lists" msgid "Lists"
@@ -1237,8 +1248,8 @@ msgid "Login to account that is not listed"
msgstr "उस खाते में लॉग इन करें जो सूचीबद्ध नहीं है" msgstr "उस खाते में लॉग इन करें जो सूचीबद्ध नहीं है"
#: src/view/screens/ProfileFeed.tsx:472 #: src/view/screens/ProfileFeed.tsx:472
msgid "Looks like this feed is only available to users with a Bluesky account. Please sign up or sign in to view this feed!" #~ msgid "Looks like this feed is only available to users with a Bluesky account. Please sign up or sign in to view this feed!"
msgstr "" #~ msgstr ""
#: src/view/com/modals/LinkWarning.tsx:63 #: src/view/com/modals/LinkWarning.tsx:63
msgid "Make sure this is where you intend to go!" msgid "Make sure this is where you intend to go!"
@@ -1261,13 +1272,12 @@ msgid "Menu"
msgstr "मेनू" msgstr "मेनू"
#: src/view/com/posts/FeedErrorMessage.tsx:194 #: src/view/com/posts/FeedErrorMessage.tsx:194
#: src/view/screens/ProfileFeed.tsx:480
msgid "Message from server" msgid "Message from server"
msgstr "" msgstr ""
#: src/view/screens/Moderation.tsx:64 #: src/view/screens/Moderation.tsx:64
#: src/view/screens/Settings.tsx:563 #: src/view/screens/Settings.tsx:563
#: src/view/shell/desktop/LeftNav.tsx:390 #: src/view/shell/desktop/LeftNav.tsx:394
#: src/view/shell/Drawer.tsx:490 #: src/view/shell/Drawer.tsx:490
#: src/view/shell/Drawer.tsx:491 #: src/view/shell/Drawer.tsx:491
msgid "Moderation" msgid "Moderation"
@@ -1286,8 +1296,8 @@ msgid "More feeds"
msgstr "अधिक फ़ीड" msgstr "अधिक फ़ीड"
#: src/view/com/profile/ProfileHeader.tsx:548 #: src/view/com/profile/ProfileHeader.tsx:548
#: src/view/screens/ProfileFeed.tsx:365 #: src/view/screens/ProfileFeed.tsx:360
#: src/view/screens/ProfileList.tsx:582 #: src/view/screens/ProfileList.tsx:583
msgid "More options" msgid "More options"
msgstr "अधिक विकल्प" msgstr "अधिक विकल्प"
@@ -1299,19 +1309,19 @@ msgstr "अधिक विकल्प"
msgid "Mute Account" msgid "Mute Account"
msgstr "खाता म्यूट करें" msgstr "खाता म्यूट करें"
#: src/view/screens/ProfileList.tsx:509 #: src/view/screens/ProfileList.tsx:510
msgid "Mute accounts" msgid "Mute accounts"
msgstr "खातों को म्यूट करें" msgstr "खातों को म्यूट करें"
#: src/view/screens/ProfileList.tsx:456 #: src/view/screens/ProfileList.tsx:457
msgid "Mute list" msgid "Mute list"
msgstr "" msgstr ""
#: src/view/screens/ProfileList.tsx:269 #: src/view/screens/ProfileList.tsx:270
msgid "Mute these accounts?" msgid "Mute these accounts?"
msgstr "इन खातों को म्यूट करें?" msgstr "इन खातों को म्यूट करें?"
#: src/view/com/util/forms/PostDropdownBtn.tsx:147 #: src/view/com/util/forms/PostDropdownBtn.tsx:149
msgid "Mute thread" msgid "Mute thread"
msgstr "थ्रेड म्यूट करें" msgstr "थ्रेड म्यूट करें"
@@ -1327,7 +1337,7 @@ msgstr "म्यूट किए गए खाते"
msgid "Muted accounts have their posts removed from your feed and from your notifications. Mutes are completely private." msgid "Muted accounts have their posts removed from your feed and from your notifications. Mutes are completely private."
msgstr "म्यूट किए गए खातों की पोस्ट आपके फ़ीड और आपकी सूचनाओं से हटा दी जाती हैं। म्यूट पूरी तरह से निजी हैं." msgstr "म्यूट किए गए खातों की पोस्ट आपके फ़ीड और आपकी सूचनाओं से हटा दी जाती हैं। म्यूट पूरी तरह से निजी हैं."
#: src/view/screens/ProfileList.tsx:271 #: src/view/screens/ProfileList.tsx:272
msgid "Muting is private. Muted accounts can interact with you, but you will not see their posts or receive notifications from them." msgid "Muting is private. Muted accounts can interact with you, but you will not see their posts or receive notifications from them."
msgstr "म्यूट करना निजी है. म्यूट किए गए खाते आपके साथ इंटरैक्ट कर सकते हैं, लेकिन आप उनकी पोस्ट नहीं देखेंगे या उनसे सूचनाएं प्राप्त नहीं करेंगे।" msgstr "म्यूट करना निजी है. म्यूट किए गए खाते आपके साथ इंटरैक्ट कर सकते हैं, लेकिन आप उनकी पोस्ट नहीं देखेंगे या उनसे सूचनाएं प्राप्त नहीं करेंगे।"
@@ -1368,9 +1378,9 @@ msgstr "नया"
#: src/view/com/feeds/FeedPage.tsx:200 #: src/view/com/feeds/FeedPage.tsx:200
#: src/view/screens/Feeds.tsx:510 #: src/view/screens/Feeds.tsx:510
#: src/view/screens/Profile.tsx:353 #: src/view/screens/Profile.tsx:353
#: src/view/screens/ProfileFeed.tsx:441 #: src/view/screens/ProfileFeed.tsx:430
#: src/view/screens/ProfileList.tsx:192 #: src/view/screens/ProfileList.tsx:193
#: src/view/screens/ProfileList.tsx:220 #: src/view/screens/ProfileList.tsx:221
#: src/view/shell/desktop/LeftNav.tsx:246 #: src/view/shell/desktop/LeftNav.tsx:246
msgid "New post" msgid "New post"
msgstr "नई पोस्ट" msgstr "नई पोस्ट"
@@ -1379,7 +1389,7 @@ msgstr "नई पोस्ट"
msgid "New Post" msgid "New Post"
msgstr "नई पोस्ट" msgstr "नई पोस्ट"
#: src/view/com/auth/create/CreateAccount.tsx:158 #: src/view/com/auth/create/CreateAccount.tsx:154
#: src/view/com/auth/login/ForgotPasswordForm.tsx:174 #: src/view/com/auth/login/ForgotPasswordForm.tsx:174
#: src/view/com/auth/login/ForgotPasswordForm.tsx:184 #: src/view/com/auth/login/ForgotPasswordForm.tsx:184
#: src/view/com/auth/login/LoginForm.tsx:281 #: src/view/com/auth/login/LoginForm.tsx:281
@@ -1399,8 +1409,8 @@ msgstr "अगली फोटो"
msgid "No" msgid "No"
msgstr "नहीं" msgstr "नहीं"
#: src/view/screens/ProfileFeed.tsx:620 #: src/view/screens/ProfileFeed.tsx:570
#: src/view/screens/ProfileList.tsx:710 #: src/view/screens/ProfileList.tsx:711
msgid "No description" msgid "No description"
msgstr "कोई विवरण नहीं" msgstr "कोई विवरण नहीं"
@@ -1451,8 +1461,8 @@ msgstr ""
#: src/view/screens/Notifications.tsx:109 #: src/view/screens/Notifications.tsx:109
#: src/view/screens/Notifications.tsx:133 #: src/view/screens/Notifications.tsx:133
#: src/view/shell/bottom-bar/BottomBar.tsx:187 #: src/view/shell/bottom-bar/BottomBar.tsx:205
#: src/view/shell/desktop/LeftNav.tsx:354 #: src/view/shell/desktop/LeftNav.tsx:358
#: src/view/shell/Drawer.tsx:416 #: src/view/shell/Drawer.tsx:416
#: src/view/shell/Drawer.tsx:417 #: src/view/shell/Drawer.tsx:417
msgid "Notifications" msgid "Notifications"
@@ -1466,7 +1476,7 @@ msgstr "अरे नहीं!"
msgid "Okay" msgid "Okay"
msgstr "ठीक है" msgstr "ठीक है"
#: src/view/com/composer/Composer.tsx:348 #: src/view/com/composer/Composer.tsx:354
msgid "One or more images is missing alt text." msgid "One or more images is missing alt text."
msgstr "एक या अधिक छवियाँ alt पाठ याद आती हैं।।" msgstr "एक या अधिक छवियाँ alt पाठ याद आती हैं।।"
@@ -1474,7 +1484,7 @@ msgstr "एक या अधिक छवियाँ alt पाठ याद
msgid "Only {0} can reply." msgid "Only {0} can reply."
msgstr "" msgstr ""
#: src/view/com/pager/FeedsTabBarMobile.tsx:79 #: src/view/com/pager/FeedsTabBarMobile.tsx:76
msgid "Open navigation" msgid "Open navigation"
msgstr "ओपन नेविगेशन" msgstr "ओपन नेविगेशन"
@@ -1586,12 +1596,17 @@ msgstr "कृपया अपना पासवर्ड भी दर्ज
#: src/view/com/modals/AppealLabel.tsx:72 #: src/view/com/modals/AppealLabel.tsx:72
#: src/view/com/modals/AppealLabel.tsx:75 #: src/view/com/modals/AppealLabel.tsx:75
msgid "Please tell us why you think this decision was incorrect." msgid "Please tell us why you think this content warning was incorrectly applied!"
msgstr "" msgstr ""
#: src/view/com/composer/Composer.tsx:331 #: src/view/com/modals/AppealLabel.tsx:72
#: src/view/com/modals/AppealLabel.tsx:75
#~ msgid "Please tell us why you think this decision was incorrect."
#~ msgstr ""
#: src/view/com/composer/Composer.tsx:337
#: src/view/com/post-thread/PostThread.tsx:226 #: src/view/com/post-thread/PostThread.tsx:226
#: src/view/screens/PostThread.tsx:78 #: src/view/screens/PostThread.tsx:80
msgid "Post" msgid "Post"
msgstr "पोस्ट" msgstr "पोस्ट"
@@ -1643,7 +1658,8 @@ msgstr "गोपनीयता नीति"
msgid "Processing..." msgid "Processing..."
msgstr "प्रसंस्करण..." msgstr "प्रसंस्करण..."
#: src/view/shell/bottom-bar/BottomBar.tsx:229 #: src/view/shell/bottom-bar/BottomBar.tsx:247
#: src/view/shell/desktop/LeftNav.tsx:412
#: src/view/shell/Drawer.tsx:69 #: src/view/shell/Drawer.tsx:69
#: src/view/shell/Drawer.tsx:525 #: src/view/shell/Drawer.tsx:525
#: src/view/shell/Drawer.tsx:526 #: src/view/shell/Drawer.tsx:526
@@ -1710,7 +1726,7 @@ msgstr "फ़ीड हटाएँ"
#: src/view/com/feeds/FeedSourceCard.tsx:105 #: src/view/com/feeds/FeedSourceCard.tsx:105
#: src/view/com/feeds/FeedSourceCard.tsx:172 #: src/view/com/feeds/FeedSourceCard.tsx:172
#: src/view/screens/ProfileFeed.tsx:275 #: src/view/screens/ProfileFeed.tsx:270
msgid "Remove from my feeds" msgid "Remove from my feeds"
msgstr "मेरे फ़ीड से हटाएँ" msgstr "मेरे फ़ीड से हटाएँ"
@@ -1755,16 +1771,16 @@ msgstr "रिपोर्ट {collectionName}"
msgid "Report Account" msgid "Report Account"
msgstr "रिपोर्ट" msgstr "रिपोर्ट"
#: src/view/screens/ProfileFeed.tsx:295 #: src/view/screens/ProfileFeed.tsx:290
msgid "Report feed" msgid "Report feed"
msgstr "रिपोर्ट फ़ीड" msgstr "रिपोर्ट फ़ीड"
#: src/view/screens/ProfileList.tsx:424 #: src/view/screens/ProfileList.tsx:425
msgid "Report List" msgid "Report List"
msgstr "रिपोर्ट सूची" msgstr "रिपोर्ट सूची"
#: src/view/com/modals/report/SendReportButton.tsx:37 #: src/view/com/modals/report/SendReportButton.tsx:37
#: src/view/com/util/forms/PostDropdownBtn.tsx:165 #: src/view/com/util/forms/PostDropdownBtn.tsx:167
msgid "Report post" msgid "Report post"
msgstr "रिपोर्ट पोस्ट" msgstr "रिपोर्ट पोस्ट"
@@ -1822,8 +1838,8 @@ msgstr "ऑनबोर्डिंग स्टेट को रीसेट
msgid "Resets the preferences state" msgid "Resets the preferences state"
msgstr "प्राथमिकताओं की स्थिति को रीसेट करें" msgstr "प्राथमिकताओं की स्थिति को रीसेट करें"
#: src/view/com/auth/create/CreateAccount.tsx:163
#: src/view/com/auth/create/CreateAccount.tsx:167 #: src/view/com/auth/create/CreateAccount.tsx:167
#: src/view/com/auth/create/CreateAccount.tsx:171
#: src/view/com/auth/login/LoginForm.tsx:258 #: src/view/com/auth/login/LoginForm.tsx:258
#: src/view/com/auth/login/LoginForm.tsx:261 #: src/view/com/auth/login/LoginForm.tsx:261
#: src/view/com/util/error/ErrorMessage.tsx:55 #: src/view/com/util/error/ErrorMessage.tsx:55
@@ -1873,8 +1889,8 @@ msgstr "सहेजे गए फ़ीड"
#: src/view/com/util/forms/SearchInput.tsx:64 #: src/view/com/util/forms/SearchInput.tsx:64
#: src/view/screens/Search/Search.tsx:401 #: src/view/screens/Search/Search.tsx:401
#: src/view/screens/Search/Search.tsx:567 #: src/view/screens/Search/Search.tsx:567
#: src/view/shell/bottom-bar/BottomBar.tsx:138 #: src/view/shell/bottom-bar/BottomBar.tsx:159
#: src/view/shell/desktop/LeftNav.tsx:315 #: src/view/shell/desktop/LeftNav.tsx:321
#: src/view/shell/desktop/Search.tsx:161 #: src/view/shell/desktop/Search.tsx:161
#: src/view/shell/desktop/Search.tsx:170 #: src/view/shell/desktop/Search.tsx:170
#: src/view/shell/Drawer.tsx:343 #: src/view/shell/Drawer.tsx:343
@@ -1886,12 +1902,16 @@ msgstr "खोज"
#~ msgid "Search for posts and users." #~ msgid "Search for posts and users."
#~ msgstr "" #~ msgstr ""
#: src/view/com/auth/LoggedOut.tsx:104
#: src/view/com/auth/LoggedOut.tsx:105
msgid "Search for users"
msgstr ""
#: src/view/com/modals/ChangeEmail.tsx:110 #: src/view/com/modals/ChangeEmail.tsx:110
msgid "Security Step Required" msgid "Security Step Required"
msgstr "सुरक्षा चरण आवश्यक" msgstr "सुरक्षा चरण आवश्यक"
#: src/view/com/auth/HomeLoggedOutCTA.tsx:39 #: src/view/com/auth/HomeLoggedOutCTA.tsx:39
#: src/view/com/auth/SplashScreen.tsx:29
msgid "See what's next" msgid "See what's next"
msgstr "आगे क्या है" msgstr "आगे क्या है"
@@ -1965,7 +1985,7 @@ msgid "Set this setting to \"Yes\" to show samples of your saved feeds in your f
msgstr "इस सेटिंग को अपने निम्नलिखित फ़ीड में अपने सहेजे गए फ़ीड के नमूने दिखाने के लिए \"हाँ\" पर सेट करें। यह एक प्रयोगात्मक विशेषता है।।" msgstr "इस सेटिंग को अपने निम्नलिखित फ़ीड में अपने सहेजे गए फ़ीड के नमूने दिखाने के लिए \"हाँ\" पर सेट करें। यह एक प्रयोगात्मक विशेषता है।।"
#: src/view/screens/Settings.tsx:277 #: src/view/screens/Settings.tsx:277
#: src/view/shell/desktop/LeftNav.tsx:426 #: src/view/shell/desktop/LeftNav.tsx:430
#: src/view/shell/Drawer.tsx:546 #: src/view/shell/Drawer.tsx:546
#: src/view/shell/Drawer.tsx:547 #: src/view/shell/Drawer.tsx:547
msgid "Settings" msgid "Settings"
@@ -1976,12 +1996,12 @@ msgid "Sexual activity or erotic nudity."
msgstr "यौन गतिविधि या कामुक नग्नता।।" msgstr "यौन गतिविधि या कामुक नग्नता।।"
#: src/view/com/profile/ProfileHeader.tsx:338 #: src/view/com/profile/ProfileHeader.tsx:338
#: src/view/com/util/forms/PostDropdownBtn.tsx:129 #: src/view/com/util/forms/PostDropdownBtn.tsx:131
#: src/view/screens/ProfileList.tsx:383 #: src/view/screens/ProfileList.tsx:384
msgid "Share" msgid "Share"
msgstr "शेयर" msgstr "शेयर"
#: src/view/screens/ProfileFeed.tsx:307 #: src/view/screens/ProfileFeed.tsx:302
msgid "Share feed" msgid "Share feed"
msgstr "" msgstr ""
@@ -2024,15 +2044,21 @@ msgstr "लोग दिखाएँ"
#: src/view/com/auth/HomeLoggedOutCTA.tsx:70 #: src/view/com/auth/HomeLoggedOutCTA.tsx:70
#: src/view/com/auth/login/Login.tsx:98 #: src/view/com/auth/login/Login.tsx:98
#: src/view/com/auth/SplashScreen.tsx:49 #: src/view/com/auth/SplashScreen.tsx:54
#: src/view/shell/bottom-bar/BottomBar.tsx:285
#: src/view/shell/bottom-bar/BottomBar.tsx:286
#: src/view/shell/bottom-bar/BottomBar.tsx:288
#: src/view/shell/bottom-bar/BottomBarWeb.tsx:177
#: src/view/shell/bottom-bar/BottomBarWeb.tsx:178
#: src/view/shell/bottom-bar/BottomBarWeb.tsx:180
#: src/view/shell/NavSignupCard.tsx:58 #: src/view/shell/NavSignupCard.tsx:58
#: src/view/shell/NavSignupCard.tsx:59 #: src/view/shell/NavSignupCard.tsx:59
msgid "Sign in" msgid "Sign in"
msgstr "साइन इन करें" msgstr "साइन इन करें"
#: src/view/com/auth/HomeLoggedOutCTA.tsx:78 #: src/view/com/auth/HomeLoggedOutCTA.tsx:78
#: src/view/com/auth/SplashScreen.tsx:52 #: src/view/com/auth/SplashScreen.tsx:57
#: src/view/com/auth/SplashScreen.web.tsx:84 #: src/view/com/auth/SplashScreen.web.tsx:87
msgid "Sign In" msgid "Sign In"
msgstr "साइन इन करें" msgstr "साइन इन करें"
@@ -2054,6 +2080,12 @@ msgstr "साइन इन करें"
msgid "Sign out" msgid "Sign out"
msgstr "साइन आउट" msgstr "साइन आउट"
#: src/view/shell/bottom-bar/BottomBar.tsx:275
#: src/view/shell/bottom-bar/BottomBar.tsx:276
#: src/view/shell/bottom-bar/BottomBar.tsx:278
#: src/view/shell/bottom-bar/BottomBarWeb.tsx:167
#: src/view/shell/bottom-bar/BottomBarWeb.tsx:168
#: src/view/shell/bottom-bar/BottomBarWeb.tsx:170
#: src/view/shell/NavSignupCard.tsx:49 #: src/view/shell/NavSignupCard.tsx:49
#: src/view/shell/NavSignupCard.tsx:50 #: src/view/shell/NavSignupCard.tsx:50
#: src/view/shell/NavSignupCard.tsx:52 #: src/view/shell/NavSignupCard.tsx:52
@@ -2105,11 +2137,11 @@ msgstr "Storybook"
msgid "Submit" msgid "Submit"
msgstr "" msgstr ""
#: src/view/screens/ProfileList.tsx:573 #: src/view/screens/ProfileList.tsx:574
msgid "Subscribe" msgid "Subscribe"
msgstr "सब्सक्राइब" msgstr "सब्सक्राइब"
#: src/view/screens/ProfileList.tsx:569 #: src/view/screens/ProfileList.tsx:570
msgid "Subscribe to this list" msgid "Subscribe to this list"
msgstr "इस सूची को सब्सक्राइब करें" msgstr "इस सूची को सब्सक्राइब करें"
@@ -2184,8 +2216,8 @@ msgid "There was an unexpected issue in the application. Please let us know if t
msgstr "एप्लिकेशन में एक अप्रत्याशित समस्या थी. कृपया हमें बताएं कि क्या आपके साथ ऐसा हुआ है!" msgstr "एप्लिकेशन में एक अप्रत्याशित समस्या थी. कृपया हमें बताएं कि क्या आपके साथ ऐसा हुआ है!"
#: src/view/com/util/moderation/LabelInfo.tsx:45 #: src/view/com/util/moderation/LabelInfo.tsx:45
msgid "This {0} has been labeled." #~ msgid "This {0} has been labeled."
msgstr "" #~ msgstr ""
#: src/view/com/util/moderation/ScreenHider.tsx:88 #: src/view/com/util/moderation/ScreenHider.tsx:88
msgid "This {screenDescription} has been flagged:" msgid "This {screenDescription} has been flagged:"
@@ -2219,7 +2251,7 @@ msgstr "यह वह सेवा है जो आपको ऑनलाइन
msgid "This link is taking you to the following website:" msgid "This link is taking you to the following website:"
msgstr "यह लिंक आपको निम्नलिखित वेबसाइट पर ले जा रहा है:" msgstr "यह लिंक आपको निम्नलिखित वेबसाइट पर ले जा रहा है:"
#: src/view/com/post-thread/PostThreadItem.tsx:124 #: src/view/com/post-thread/PostThreadItem.tsx:123
msgid "This post has been deleted." msgid "This post has been deleted."
msgstr "इस पोस्ट को हटा दिया गया है।।" msgstr "इस पोस्ट को हटा दिया गया है।।"
@@ -2244,9 +2276,9 @@ msgstr "ड्रॉपडाउन टॉगल करें"
msgid "Transformations" msgid "Transformations"
msgstr "परिवर्तन" msgstr "परिवर्तन"
#: src/view/com/post-thread/PostThreadItem.tsx:704
#: src/view/com/post-thread/PostThreadItem.tsx:706 #: src/view/com/post-thread/PostThreadItem.tsx:706
#: src/view/com/post-thread/PostThreadItem.tsx:708 #: src/view/com/util/forms/PostDropdownBtn.tsx:103
#: src/view/com/util/forms/PostDropdownBtn.tsx:101
msgid "Translate" msgid "Translate"
msgstr "अनुवाद" msgstr "अनुवाद"
@@ -2254,11 +2286,11 @@ msgstr "अनुवाद"
msgid "Try again" msgid "Try again"
msgstr "फिर से कोशिश करो" msgstr "फिर से कोशिश करो"
#: src/view/screens/ProfileList.tsx:471 #: src/view/screens/ProfileList.tsx:472
msgid "Un-block list" msgid "Un-block list"
msgstr "" msgstr ""
#: src/view/screens/ProfileList.tsx:456 #: src/view/screens/ProfileList.tsx:457
msgid "Un-mute list" msgid "Un-mute list"
msgstr "" msgstr ""
@@ -2290,11 +2322,11 @@ msgstr ""
msgid "Unmute Account" msgid "Unmute Account"
msgstr "अनम्यूट खाता" msgstr "अनम्यूट खाता"
#: src/view/com/util/forms/PostDropdownBtn.tsx:147 #: src/view/com/util/forms/PostDropdownBtn.tsx:149
msgid "Unmute thread" msgid "Unmute thread"
msgstr "थ्रेड को अनम्यूट करें" msgstr "थ्रेड को अनम्यूट करें"
#: src/view/screens/ProfileList.tsx:439 #: src/view/screens/ProfileList.tsx:440
msgid "Unpin moderation list" msgid "Unpin moderation list"
msgstr "" msgstr ""
@@ -2343,7 +2375,7 @@ msgstr "लोग सूचियाँ"
msgid "Username or email address" msgid "Username or email address"
msgstr "यूजर नाम या ईमेल पता" msgstr "यूजर नाम या ईमेल पता"
#: src/view/screens/ProfileList.tsx:737 #: src/view/screens/ProfileList.tsx:738
msgid "Users" msgid "Users"
msgstr "यूजर लोग" msgstr "यूजर लोग"
@@ -2388,7 +2420,7 @@ msgstr "अवतार देखें"
msgid "Visit Site" msgid "Visit Site"
msgstr "साइट पर जाएं" msgstr "साइट पर जाएं"
#: src/view/com/auth/create/CreateAccount.tsx:125 #: src/view/com/auth/create/CreateAccount.tsx:121
msgid "We're so excited to have you join us!" msgid "We're so excited to have you join us!"
msgstr "हम आपके हमारी सेवा में शामिल होने को लेकर बहुत उत्साहित हैं!" msgstr "हम आपके हमारी सेवा में शामिल होने को लेकर बहुत उत्साहित हैं!"
@@ -2416,6 +2448,10 @@ msgstr "<0>Bluesky</0> में आपका स्वागत है"
msgid "What is the issue with this {collectionName}?" msgid "What is the issue with this {collectionName}?"
msgstr "इस {collectionName} के साथ क्या मुद्दा है?" msgstr "इस {collectionName} के साथ क्या मुद्दा है?"
#: src/view/com/auth/SplashScreen.tsx:34
msgid "What's up?"
msgstr ""
#: src/view/com/modals/lang-settings/PostLanguagesSettings.tsx:78 #: src/view/com/modals/lang-settings/PostLanguagesSettings.tsx:78
msgid "Which languages are used in this post?" msgid "Which languages are used in this post?"
msgstr "इस पोस्ट में किस भाषा का उपयोग किया जाता है?" msgstr "इस पोस्ट में किस भाषा का उपयोग किया जाता है?"
@@ -2437,7 +2473,7 @@ msgstr ""
msgid "Wide" msgid "Wide"
msgstr "चौड़ा" msgstr "चौड़ा"
#: src/view/com/composer/Composer.tsx:403 #: src/view/com/composer/Composer.tsx:409
msgid "Write post" msgid "Write post"
msgstr "पोस्ट लिखो" msgstr "पोस्ट लिखो"
File diff suppressed because it is too large Load Diff
+1 -45
View File
@@ -161,51 +161,6 @@ export function useFeedSourceInfoQuery({uri}: {uri: string}) {
}) })
} }
export const isFeedPublicQueryKey = ({uri}: {uri: string}) => [
'isFeedPublic',
uri,
]
export function useIsFeedPublicQuery({uri}: {uri: string}) {
return useQuery({
queryKey: isFeedPublicQueryKey({uri}),
queryFn: async ({queryKey}) => {
const [, uri] = queryKey
try {
const res = await getAgent().app.bsky.feed.getFeed({
feed: uri,
limit: 1,
})
return {
isPublic: Boolean(res.data.feed),
error: undefined,
}
} catch (e: any) {
/**
* This should be an `XRPCError`, but I can't safely import from
* `@atproto/xrpc` due to a depdency on node's `crypto` module.
*
* @see https://github.com/bluesky-social/atproto/blob/c17971a2d8e424cc7f10c071d97c07c08aa319cf/packages/xrpc/src/client.ts#L126
*/
if (e?.status === 401) {
return {
isPublic: false,
error: e,
}
}
/*
* Non-401 response means something else went wrong on the server
*/
return {
isPublic: true,
error: e,
}
}
},
})
}
export const useGetPopularFeedsQueryKey = ['getPopularFeeds'] export const useGetPopularFeedsQueryKey = ['getPopularFeeds']
export function useGetPopularFeedsQuery() { export function useGetPopularFeedsQuery() {
@@ -294,6 +249,7 @@ export function usePinnedFeedsInfos(): {
// these requests can fail, need to filter those out // these requests can fail, need to filter those out
try { try {
return await queryClient.fetchQuery({ return await queryClient.fetchQuery({
staleTime: STALE.SECONDS.FIFTEEN,
queryKey: feedSourceInfoQueryKey({uri}), queryKey: feedSourceInfoQueryKey({uri}),
queryFn: async () => { queryFn: async () => {
const type = getFeedTypeFromUri(uri) const type = getFeedTypeFromUri(uri)
+17 -14
View File
@@ -16,7 +16,7 @@
* 3. Don't call this query's `refetch()` if you're trying to sync latest; call `checkUnread()` instead. * 3. Don't call this query's `refetch()` if you're trying to sync latest; call `checkUnread()` instead.
*/ */
import {useEffect} from 'react' import {useEffect, useRef} from 'react'
import {AppBskyFeedDefs} from '@atproto/api' import {AppBskyFeedDefs} from '@atproto/api'
import { import {
useInfiniteQuery, useInfiniteQuery,
@@ -49,6 +49,7 @@ export function useNotificationFeedQuery(opts?: {enabled?: boolean}) {
const threadMutes = useMutedThreads() const threadMutes = useMutedThreads()
const unreads = useUnreadNotificationsApi() const unreads = useUnreadNotificationsApi()
const enabled = opts?.enabled !== false const enabled = opts?.enabled !== false
const lastPageCountRef = useRef(0)
const query = useInfiniteQuery< const query = useInfiniteQuery<
FeedPage, FeedPage,
@@ -104,24 +105,26 @@ export function useNotificationFeedQuery(opts?: {enabled?: boolean}) {
useEffect(() => { useEffect(() => {
const {isFetching, hasNextPage, data} = query const {isFetching, hasNextPage, data} = query
if (isFetching || !hasNextPage) {
let count = 0 return
let numEmpties = 0
for (const page of data?.pages || []) {
if (!page.items.length) {
numEmpties++
}
count += page.items.length
} }
// avoid double-fires of fetchNextPage()
if ( if (
!isFetching && lastPageCountRef.current !== 0 &&
hasNextPage && lastPageCountRef.current === data?.pages?.length
count < PAGE_SIZE &&
numEmpties < 3 &&
(data?.pages.length || 0) < 6
) { ) {
return
}
// fetch next page if we haven't gotten a full page of content
let count = 0
for (const page of data?.pages || []) {
count += page.items.length
}
if (count < PAGE_SIZE && (data?.pages.length || 0) < 6) {
query.fetchNextPage() query.fetchNextPage()
lastPageCountRef.current = data?.pages?.length || 0
} }
}, [query]) }, [query])
+21 -14
View File
@@ -1,4 +1,4 @@
import React, {useCallback, useEffect} from 'react' import React, {useCallback, useEffect, useRef} from 'react'
import { import {
AppBskyFeedDefs, AppBskyFeedDefs,
AppBskyFeedPost, AppBskyFeedPost,
@@ -78,6 +78,7 @@ export interface FeedPageUnselected {
api: FeedAPI api: FeedAPI
cursor: string | undefined cursor: string | undefined
feed: AppBskyFeedDefs.FeedViewPost[] feed: AppBskyFeedDefs.FeedViewPost[]
fetchedAt: number
} }
export interface FeedPage { export interface FeedPage {
@@ -85,6 +86,7 @@ export interface FeedPage {
tuner: FeedTuner | NoopFeedTuner tuner: FeedTuner | NoopFeedTuner
cursor: string | undefined cursor: string | undefined
slices: FeedPostSlice[] slices: FeedPostSlice[]
fetchedAt: number
} }
const PAGE_SIZE = 30 const PAGE_SIZE = 30
@@ -98,11 +100,12 @@ export function usePostFeedQuery(
const feedTuners = useFeedTuners(feedDesc) const feedTuners = useFeedTuners(feedDesc)
const moderationOpts = useModerationOpts() const moderationOpts = useModerationOpts()
const enabled = opts?.enabled !== false && Boolean(moderationOpts) const enabled = opts?.enabled !== false && Boolean(moderationOpts)
const lastRun = React.useRef<{ const lastRun = useRef<{
data: InfiniteData<FeedPageUnselected> data: InfiniteData<FeedPageUnselected>
args: typeof selectArgs args: typeof selectArgs
result: InfiniteData<FeedPage> result: InfiniteData<FeedPage>
} | null>(null) } | null>(null)
const lastPageCountRef = useRef(0)
// Make sure this doesn't invalidate unless really needed. // Make sure this doesn't invalidate unless really needed.
const selectArgs = React.useMemo( const selectArgs = React.useMemo(
@@ -152,6 +155,7 @@ export function usePostFeedQuery(
api, api,
cursor: res.cursor, cursor: res.cursor,
feed: res.feed, feed: res.feed,
fetchedAt: Date.now(),
} }
}, },
initialPageParam: undefined, initialPageParam: undefined,
@@ -214,6 +218,7 @@ export function usePostFeedQuery(
api: page.api, api: page.api,
tuner, tuner,
cursor: page.cursor, cursor: page.cursor,
fetchedAt: page.fetchedAt,
slices: tuner slices: tuner
.tune(page.feed) .tune(page.feed)
.map(slice => { .map(slice => {
@@ -279,26 +284,28 @@ export function usePostFeedQuery(
useEffect(() => { useEffect(() => {
const {isFetching, hasNextPage, data} = query const {isFetching, hasNextPage, data} = query
if (isFetching || !hasNextPage) {
return
}
// avoid double-fires of fetchNextPage()
if (
lastPageCountRef.current !== 0 &&
lastPageCountRef.current === data?.pages?.length
) {
return
}
// fetch next page if we haven't gotten a full page of content
let count = 0 let count = 0
let numEmpties = 0
for (const page of data?.pages || []) { for (const page of data?.pages || []) {
if (page.slices.length === 0) {
numEmpties++
}
for (const slice of page.slices) { for (const slice of page.slices) {
count += slice.items.length count += slice.items.length
} }
} }
if (count < PAGE_SIZE && (data?.pages.length || 0) < 6) {
if (
!isFetching &&
hasNextPage &&
count < PAGE_SIZE &&
numEmpties < 3 &&
(data?.pages.length || 0) < 6
) {
query.fetchNextPage() query.fetchNextPage()
lastPageCountRef.current = data?.pages?.length || 0
} }
}, [query]) }, [query])
+1 -3
View File
@@ -35,9 +35,7 @@ export function useProfileQuery({did}: {did: string | undefined}) {
// if you remove it, the UI infinite-loops // if you remove it, the UI infinite-loops
// -prf // -prf
staleTime: isCurrentAccount ? STALE.SECONDS.THIRTY : STALE.MINUTES.FIVE, staleTime: isCurrentAccount ? STALE.SECONDS.THIRTY : STALE.MINUTES.FIVE,
refetchInterval: isCurrentAccount refetchInterval: STALE.MINUTES.FIVE,
? STALE.SECONDS.THIRTY
: STALE.MINUTES.FIVE,
queryKey: RQKEY(did || ''), queryKey: RQKEY(did || ''),
queryFn: async () => { queryFn: async () => {
const res = await getAgent().getProfile({actor: did || ''}) const res = await getAgent().getProfile({actor: did || ''})
+2
View File
@@ -189,6 +189,7 @@ export function Provider({children}: React.PropsWithChildren<{}>) {
}, },
logger.DebugContext.session, logger.DebugContext.session,
) )
track('Try Create Account')
const agent = new BskyAgent({service}) const agent = new BskyAgent({service})
@@ -231,6 +232,7 @@ export function Provider({children}: React.PropsWithChildren<{}>) {
}, },
logger.DebugContext.session, logger.DebugContext.session,
) )
track('Create Account')
}, },
[upsertAccount, queryClient], [upsertAccount, queryClient],
) )
+44 -3
View File
@@ -3,8 +3,9 @@ import {View, Pressable} from 'react-native'
import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import {msg} from '@lingui/macro' import {msg} from '@lingui/macro'
import {useNavigation} from '@react-navigation/native'
import {isIOS} from 'platform/detection' import {isIOS, isNative} from 'platform/detection'
import {Login} from 'view/com/auth/login/Login' import {Login} from 'view/com/auth/login/Login'
import {CreateAccount} from 'view/com/auth/create/CreateAccount' import {CreateAccount} from 'view/com/auth/create/CreateAccount'
import {ErrorBoundary} from 'view/com/util/ErrorBoundary' import {ErrorBoundary} from 'view/com/util/ErrorBoundary'
@@ -18,6 +19,9 @@ import {
useLoggedOutView, useLoggedOutView,
useLoggedOutViewControls, useLoggedOutViewControls,
} from '#/state/shell/logged-out' } from '#/state/shell/logged-out'
import {useSession} from '#/state/session'
import {Text} from '#/view/com/util/text/Text'
import {NavigationProp} from 'lib/routes/types'
enum ScreenState { enum ScreenState {
S_LoginOrCreateAccount, S_LoginOrCreateAccount,
@@ -26,6 +30,7 @@ enum ScreenState {
} }
export function LoggedOut({onDismiss}: {onDismiss?: () => void}) { export function LoggedOut({onDismiss}: {onDismiss?: () => void}) {
const {hasSession} = useSession()
const {_} = useLingui() const {_} = useLingui()
const pal = usePalette('default') const pal = usePalette('default')
const setMinimalShellMode = useSetMinimalShellMode() const setMinimalShellMode = useSetMinimalShellMode()
@@ -40,6 +45,8 @@ export function LoggedOut({onDismiss}: {onDismiss?: () => void}) {
) )
const {isMobile} = useWebMediaQueries() const {isMobile} = useWebMediaQueries()
const {clearRequestedAccount} = useLoggedOutViewControls() const {clearRequestedAccount} = useLoggedOutViewControls()
const navigation = useNavigation<NavigationProp>()
const isFirstScreen = screenState === ScreenState.S_LoginOrCreateAccount
React.useEffect(() => { React.useEffect(() => {
screen('Login') screen('Login')
@@ -53,6 +60,10 @@ export function LoggedOut({onDismiss}: {onDismiss?: () => void}) {
clearRequestedAccount() clearRequestedAccount()
}, [clearRequestedAccount, onDismiss]) }, [clearRequestedAccount, onDismiss])
const onPressSearch = React.useCallback(() => {
navigation.navigate(`SearchTab`)
}, [navigation])
return ( return (
<View <View
testID="noSessionView" testID="noSessionView"
@@ -65,7 +76,7 @@ export function LoggedOut({onDismiss}: {onDismiss?: () => void}) {
}, },
]}> ]}>
<ErrorBoundary> <ErrorBoundary>
{onDismiss && ( {onDismiss ? (
<Pressable <Pressable
accessibilityHint={_(msg`Go back`)} accessibilityHint={_(msg`Go back`)}
accessibilityLabel={_(msg`Go back`)} accessibilityLabel={_(msg`Go back`)}
@@ -88,7 +99,37 @@ export function LoggedOut({onDismiss}: {onDismiss?: () => void}) {
}} }}
/> />
</Pressable> </Pressable>
)} ) : isNative && !hasSession && isFirstScreen ? (
<Pressable
accessibilityHint={_(msg`Search for users`)}
accessibilityLabel={_(msg`Search for users`)}
accessibilityRole="button"
style={{
flexDirection: 'row',
alignItems: 'center',
gap: 4,
position: 'absolute',
top: 20,
right: 20,
paddingHorizontal: 16,
paddingVertical: 8,
zIndex: 100,
backgroundColor: pal.btn.backgroundColor,
borderRadius: 100,
}}
onPress={onPressSearch}>
<Text type="lg-bold" style={[pal.text]}>
Search{' '}
</Text>
<FontAwesomeIcon
icon="search"
size={16}
style={{
color: String(pal.text.color),
}}
/>
</Pressable>
) : null}
{screenState === ScreenState.S_LoginOrCreateAccount ? ( {screenState === ScreenState.S_LoginOrCreateAccount ? (
<SplashScreen <SplashScreen
+2 -2
View File
@@ -27,11 +27,11 @@ export const SplashScreen = ({
<Logo width={92} fill="sky" /> <Logo width={92} fill="sky" />
<View style={{paddingTop: 40, paddingBottom: 6}}> <View style={{paddingTop: 40, paddingBottom: 6}}>
<Logotype width={161} /> <Logotype width={161} fill={pal.text.color} />
</View> </View>
<Text type="lg-medium" style={[pal.textLight]}> <Text type="lg-medium" style={[pal.textLight]}>
<Trans>What's next?</Trans> <Trans>What's up?</Trans>
</Text> </Text>
</View> </View>
<View testID="signinOrCreateAccount" style={styles.btns}> <View testID="signinOrCreateAccount" style={styles.btns}>
+1 -1
View File
@@ -63,7 +63,7 @@ export const SplashScreen = ({
<Logo width={92} fill="sky" /> <Logo width={92} fill="sky" />
<View style={{paddingTop: 40, paddingBottom: 20}}> <View style={{paddingTop: 40, paddingBottom: 20}}>
<Logotype width={161} /> <Logotype width={161} fill={pal.text.color} />
</View> </View>
<View testID="signinOrCreateAccount" style={styles.btns}> <View testID="signinOrCreateAccount" style={styles.btns}>
+1 -5
View File
@@ -30,7 +30,7 @@ import {Step2} from './Step2'
import {Step3} from './Step3' import {Step3} from './Step3'
export function CreateAccount({onPressBack}: {onPressBack: () => void}) { export function CreateAccount({onPressBack}: {onPressBack: () => void}) {
const {track, screen} = useAnalytics() const {screen} = useAnalytics()
const pal = usePalette('default') const pal = usePalette('default')
const {_} = useLingui() const {_} = useLingui()
const [uiState, uiDispatch] = useCreateAccount() const [uiState, uiDispatch] = useCreateAccount()
@@ -93,21 +93,17 @@ export function CreateAccount({onPressBack}: {onPressBack: () => void}) {
uiDispatch, uiDispatch,
_, _,
}) })
track('Create Account')
setBirthDate({birthDate: uiState.birthDate}) setBirthDate({birthDate: uiState.birthDate})
if (IS_PROD(uiState.serviceUrl)) { if (IS_PROD(uiState.serviceUrl)) {
setSavedFeeds(DEFAULT_PROD_FEEDS) setSavedFeeds(DEFAULT_PROD_FEEDS)
} }
} catch { } catch {
// dont need to handle here // dont need to handle here
} finally {
track('Try Create Account')
} }
} }
}, [ }, [
uiState, uiState,
uiDispatch, uiDispatch,
track,
onboardingDispatch, onboardingDispatch,
createAccount, createAccount,
setBirthDate, setBirthDate,
+6
View File
@@ -62,6 +62,7 @@ import {useProfileQuery} from '#/state/queries/profile'
import {useComposerControls} from '#/state/shell/composer' import {useComposerControls} from '#/state/shell/composer'
import {emitPostCreated} from '#/state/events' import {emitPostCreated} from '#/state/events'
import {ThreadgateSetting} from '#/state/queries/threadgate' import {ThreadgateSetting} from '#/state/queries/threadgate'
import {logger} from '#/logger'
type Props = ComposerOpts type Props = ComposerOpts
export const ComposePost = observer(function ComposePost({ export const ComposePost = observer(function ComposePost({
@@ -228,6 +229,11 @@ export const ComposePost = observer(function ComposePost({
}) })
).uri ).uri
} catch (e: any) { } catch (e: any) {
logger.error(e, {
message: `Composer: create post failed`,
hasImages: gallery.size > 0,
})
if (extLink) { if (extLink) {
setExtLink({ setExtLink({
...extLink, ...extLink,
@@ -215,7 +215,13 @@ export const TextInput = forwardRef(function TextInputImpl(
autoFocus={true} autoFocus={true}
allowFontScaling allowFontScaling
multiline multiline
style={[pal.text, styles.textInput, styles.textInputFormatting]} numberOfLines={4}
style={[
pal.text,
styles.textInput,
styles.textInputFormatting,
{textAlignVertical: 'top'},
]}
{...props}> {...props}>
{textDecorated} {textDecorated}
</PasteInput> </PasteInput>
+1 -1
View File
@@ -29,7 +29,7 @@ import {truncateAndInvalidate} from '#/state/queries/util'
import {TabState, getTabState, getRootNavigation} from '#/lib/routes/helpers' import {TabState, getTabState, getRootNavigation} from '#/lib/routes/helpers'
import {isNative} from '#/platform/detection' import {isNative} from '#/platform/detection'
const POLL_FREQ = 30e3 // 30sec const POLL_FREQ = 60e3 // 60sec
export function FeedPage({ export function FeedPage({
testID, testID,
+3 -3
View File
@@ -62,17 +62,17 @@ export function Component(props: ReportComponentProps) {
<Text <Text
type="2xl-bold" type="2xl-bold"
style={[pal.text, s.textCenter, {paddingBottom: 8}]}> style={[pal.text, s.textCenter, {paddingBottom: 8}]}>
<Trans>Appeal Decision</Trans> <Trans>Appeal Content Warning</Trans>
</Text> </Text>
<ScrollView> <ScrollView>
<View style={[pal.btn, styles.detailsInputContainer]}> <View style={[pal.btn, styles.detailsInputContainer]}>
<TextInput <TextInput
accessibilityLabel={_(msg`Text input field`)} accessibilityLabel={_(msg`Text input field`)}
accessibilityHint={_( accessibilityHint={_(
msg`Please tell us why you think this decision was incorrect.`, msg`Please tell us why you think this content warning was incorrectly applied!`,
)} )}
placeholder={_( placeholder={_(
msg`Please tell us why you think this decision was incorrect.`, msg`Please tell us why you think this content warning was incorrectly applied!`,
)} )}
placeholderTextColor={pal.textLight.color} placeholderTextColor={pal.textLight.color}
value={details} value={details}
+1 -1
View File
@@ -82,7 +82,7 @@ export function ModalsContainer() {
useEffect(() => { useEffect(() => {
if (isModalActive) { if (isModalActive) {
bottomSheetRef.current?.expand() bottomSheetRef.current?.snapToIndex(0)
} else { } else {
bottomSheetRef.current?.close() bottomSheetRef.current?.close()
} }
+6 -8
View File
@@ -42,7 +42,6 @@ import {useComposerControls} from '#/state/shell/composer'
import {useModerationOpts} from '#/state/queries/preferences' import {useModerationOpts} from '#/state/queries/preferences'
import {Shadow, usePostShadow, POST_TOMBSTONE} from '#/state/cache/post-shadow' import {Shadow, usePostShadow, POST_TOMBSTONE} from '#/state/cache/post-shadow'
import {ThreadPost} from '#/state/queries/post-thread' import {ThreadPost} from '#/state/queries/post-thread'
import {LabelInfo} from '../util/moderation/LabelInfo'
import {useSession} from '#/state/session' import {useSession} from '#/state/session'
import {WhoCanReply} from '../threadgate/WhoCanReply' import {WhoCanReply} from '../threadgate/WhoCanReply'
@@ -187,6 +186,9 @@ let PostThreadItemLoaded = ({
return makeProfileLink(post.author, 'post', urip.rkey, 'reposted-by') return makeProfileLink(post.author, 'post', urip.rkey, 'reposted-by')
}, [post.uri, post.author]) }, [post.uri, post.author])
const repostsTitle = 'Reposts of this post' const repostsTitle = 'Reposts of this post'
const isSelfLabeledPost =
moderation.decisions.post.cause?.type === 'label' &&
moderation.decisions.post.cause.label.src === currentAccount?.did
const translatorUrl = getTranslatorLink( const translatorUrl = getTranslatorLink(
record?.text || '', record?.text || '',
@@ -332,6 +334,9 @@ let PostThreadItemLoaded = ({
postCid={post.cid} postCid={post.cid}
postUri={post.uri} postUri={post.uri}
record={record} record={record}
showAppealLabelItem={
post.author.did === currentAccount?.did && !isSelfLabeledPost
}
style={{ style={{
paddingVertical: 6, paddingVertical: 6,
paddingHorizontal: 10, paddingHorizontal: 10,
@@ -351,13 +356,6 @@ let PostThreadItemLoaded = ({
includeMute includeMute
style={styles.alert} style={styles.alert}
/> />
{post.author.did === currentAccount?.did ? (
<LabelInfo
details={{uri: post.uri, cid: post.cid}}
labels={post.labels}
style={{marginBottom: 8}}
/>
) : null}
{richText?.text ? ( {richText?.text ? (
<View <View
style={[ style={[
+22 -4
View File
@@ -27,12 +27,16 @@ import {
import {isWeb} from '#/platform/detection' import {isWeb} from '#/platform/detection'
import {listenPostCreated} from '#/state/events' import {listenPostCreated} from '#/state/events'
import {useSession} from '#/state/session' import {useSession} from '#/state/session'
import {STALE} from '#/state/queries'
const LOADING_ITEM = {_reactKey: '__loading__'} const LOADING_ITEM = {_reactKey: '__loading__'}
const EMPTY_FEED_ITEM = {_reactKey: '__empty__'} const EMPTY_FEED_ITEM = {_reactKey: '__empty__'}
const ERROR_ITEM = {_reactKey: '__error__'} const ERROR_ITEM = {_reactKey: '__error__'}
const LOAD_MORE_ERROR_ITEM = {_reactKey: '__load_more_error__'} const LOAD_MORE_ERROR_ITEM = {_reactKey: '__load_more_error__'}
const REFRESH_AFTER = STALE.HOURS.ONE
const CHECK_LATEST_AFTER = STALE.SECONDS.THIRTY
let Feed = ({ let Feed = ({
feed, feed,
feedParams, feedParams,
@@ -74,6 +78,7 @@ let Feed = ({
const {currentAccount} = useSession() const {currentAccount} = useSession()
const [isPTRing, setIsPTRing] = React.useState(false) const [isPTRing, setIsPTRing] = React.useState(false)
const checkForNewRef = React.useRef<(() => void) | null>(null) const checkForNewRef = React.useRef<(() => void) | null>(null)
const lastFetchRef = React.useRef<number>(Date.now())
const opts = React.useMemo( const opts = React.useMemo(
() => ({enabled, ignoreFilterFor}), () => ({enabled, ignoreFilterFor}),
@@ -91,6 +96,9 @@ let Feed = ({
fetchNextPage, fetchNextPage,
} = usePostFeedQuery(feed, feedParams, opts) } = usePostFeedQuery(feed, feedParams, opts)
const isEmpty = !isFetching && !data?.pages[0]?.slices.length const isEmpty = !isFetching && !data?.pages[0]?.slices.length
if (data?.pages[0]) {
lastFetchRef.current = data?.pages[0].fetchedAt
}
const checkForNew = React.useCallback(async () => { const checkForNew = React.useCallback(async () => {
if (!data?.pages[0] || isFetching || !onHasNew || !enabled) { if (!data?.pages[0] || isFetching || !onHasNew || !enabled) {
@@ -130,11 +138,21 @@ let Feed = ({
checkForNewRef.current = checkForNew checkForNewRef.current = checkForNew
}, [checkForNew]) }, [checkForNew])
React.useEffect(() => { React.useEffect(() => {
if (enabled && checkForNewRef.current) { if (enabled) {
// check for new on enable (aka on focus) const timeSinceFirstLoad = Date.now() - lastFetchRef.current
checkForNewRef.current() if (timeSinceFirstLoad > REFRESH_AFTER) {
// do a full refresh
scrollElRef?.current?.scrollToOffset({offset: 0, animated: false})
queryClient.resetQueries({queryKey: RQKEY(feed)})
} else if (
timeSinceFirstLoad > CHECK_LATEST_AFTER &&
checkForNewRef.current
) {
// check for new on enable (aka on focus)
checkForNewRef.current()
}
} }
}, [enabled]) }, [enabled, feed, queryClient, scrollElRef])
React.useEffect(() => { React.useEffect(() => {
let cleanup1: () => void | undefined, cleanup2: () => void | undefined let cleanup1: () => void | undefined, cleanup2: () => void | undefined
const subscription = AppState.addEventListener('change', nextAppState => { const subscription = AppState.addEventListener('change', nextAppState => {
@@ -31,6 +31,7 @@ let PostDropdownBtn = ({
postUri, postUri,
record, record,
style, style,
showAppealLabelItem,
}: { }: {
testID: string testID: string
postAuthor: AppBskyActorDefs.ProfileViewBasic postAuthor: AppBskyActorDefs.ProfileViewBasic
@@ -38,6 +39,7 @@ let PostDropdownBtn = ({
postUri: string postUri: string
record: AppBskyFeedPost.Record record: AppBskyFeedPost.Record
style?: StyleProp<ViewStyle> style?: StyleProp<ViewStyle>
showAppealLabelItem?: boolean
}): React.ReactNode => { }): React.ReactNode => {
const {hasSession, currentAccount} = useSession() const {hasSession, currentAccount} = useSession()
const theme = useTheme() const theme = useTheme()
@@ -198,6 +200,23 @@ let PostDropdownBtn = ({
web: ['far', 'trash-can'], web: ['far', 'trash-can'],
}, },
}, },
showAppealLabelItem && {
label: 'separator',
},
showAppealLabelItem && {
label: _(msg`Appeal content warning`),
onPress() {
openModal({name: 'appeal-label', uri: postUri, cid: postCid})
},
testID: 'postDropdownAppealBtn',
icon: {
ios: {
name: 'exclamationmark.triangle',
},
android: 'ic_menu_report_image',
web: 'circle-exclamation',
},
},
].filter(Boolean) as NativeDropdownItem[] ].filter(Boolean) as NativeDropdownItem[]
return ( return (
+2 -1
View File
@@ -43,7 +43,8 @@ export function LabelInfo({
]}> ]}>
<Text type="sm" style={pal.text}> <Text type="sm" style={pal.text}>
<Trans> <Trans>
This {'did' in details ? 'account' : 'post'} has been labeled. A content warning has been applied to this{' '}
{'did' in details ? 'account' : 'post'}.
</Trans>{' '} </Trans>{' '}
</Text> </Text>
<Pressable <Pressable
+3 -6
View File
@@ -10,7 +10,7 @@ import {AppBskyFeedDefs, AppBskyFeedPost} from '@atproto/api'
import {Text} from '../text/Text' import {Text} from '../text/Text'
import {PostDropdownBtn} from '../forms/PostDropdownBtn' import {PostDropdownBtn} from '../forms/PostDropdownBtn'
import {HeartIcon, HeartIconSolid, CommentBottomArrow} from 'lib/icons' import {HeartIcon, HeartIconSolid, CommentBottomArrow} from 'lib/icons'
import {s, colors} from 'lib/styles' import {s} from 'lib/styles'
import {pluralize} from 'lib/strings/helpers' import {pluralize} from 'lib/strings/helpers'
import {useTheme} from 'lib/ThemeContext' import {useTheme} from 'lib/ThemeContext'
import {RepostButton} from './RepostButton' import {RepostButton} from './RepostButton'
@@ -180,7 +180,7 @@ let PostCtrls = ({
accessibilityHint="" accessibilityHint=""
hitSlop={big ? HITSLOP_20 : HITSLOP_10}> hitSlop={big ? HITSLOP_20 : HITSLOP_10}>
{post.viewer?.like ? ( {post.viewer?.like ? (
<HeartIconSolid style={styles.ctrlIconLiked} size={big ? 22 : 16} /> <HeartIconSolid style={s.likeColor} size={big ? 22 : 16} />
) : ( ) : (
<HeartIcon <HeartIcon
style={[defaultCtrlColor, big ? styles.mt1 : undefined]} style={[defaultCtrlColor, big ? styles.mt1 : undefined]}
@@ -193,7 +193,7 @@ let PostCtrls = ({
testID="likeCount" testID="likeCount"
style={ style={
post.viewer?.like post.viewer?.like
? [s.bold, s.red3, s.f15, s.ml5] ? [s.bold, s.likeColor, s.f15, s.ml5]
: [defaultCtrlColor, s.f15, s.ml5] : [defaultCtrlColor, s.f15, s.ml5]
}> }>
{post.likeCount} {post.likeCount}
@@ -233,9 +233,6 @@ const styles = StyleSheet.create({
paddingLeft: 5, paddingLeft: 5,
paddingRight: 5, paddingRight: 5,
}, },
ctrlIconLiked: {
color: colors.like,
},
mt1: { mt1: {
marginTop: 1, marginTop: 1,
}, },
+3 -2
View File
@@ -1,7 +1,7 @@
import React from 'react' import React from 'react'
import Svg, {Path, SvgProps, PathProps} from 'react-native-svg' import Svg, {Path, SvgProps, PathProps} from 'react-native-svg'
import {colors} from '#/lib/styles' import {usePalette} from '#/lib/hooks/usePalette'
const ratio = 17 / 64 const ratio = 17 / 64
@@ -9,6 +9,7 @@ export function Logotype({
fill, fill,
...rest ...rest
}: {fill?: PathProps['fill']} & SvgProps) { }: {fill?: PathProps['fill']} & SvgProps) {
const pal = usePalette('default')
// @ts-ignore it's fiiiiine // @ts-ignore it's fiiiiine
const size = parseInt(rest.width || 32) const size = parseInt(rest.width || 32)
@@ -20,7 +21,7 @@ export function Logotype({
width={size} width={size}
height={Number(size) * ratio}> height={Number(size) * ratio}>
<Path <Path
fill={fill || colors.black} fill={fill || pal.text.color}
d="M8.478 6.252c1.503.538 2.3 1.78 2.3 3.172 0 2.356-1.576 3.785-4.6 3.785H0V0h5.974c2.875 0 4.267 1.466 4.267 3.413 0 1.3-.594 2.245-1.763 2.839Zm-2.69-4.193H2.504v3.45h3.284c1.28 0 1.967-.667 1.967-1.78 0-1.02-.705-1.67-1.967-1.67Zm-3.284 9.072h3.544c1.41 0 2.17-.65 2.17-1.818 0-1.224-.723-1.837-2.17-1.837H2.504v3.655ZM14.251 13.209h-2.337V0h2.337v13.209ZM22.001 8.998V3.636h2.338v9.573h-2.263v-1.392c-.724 1.076-1.726 1.614-3.006 1.614-2.022 0-3.34-1.224-3.34-3.45V3.636h2.338v5.955c0 1.206.594 1.818 1.8 1.818 1.132 0 2.133-.835 2.133-2.411ZM34.979 8.59v.556h-7.161c.167 1.651 1.076 2.467 2.486 2.467 1.076 0 1.8-.463 2.189-1.372h2.244c-.5 1.947-2.17 3.19-4.452 3.19-1.428 0-2.579-.463-3.45-1.372-.872-.91-1.318-2.115-1.318-3.637 0-1.502.427-2.708 1.299-3.636.872-.909 2.004-1.372 3.432-1.372 1.447 0 2.597.482 3.45 1.428.854.946 1.28 2.208 1.28 3.747Zm-4.75-3.358c-1.28 0-2.17.742-2.393 2.281h4.805c-.204-1.391-1.057-2.281-2.411-2.281ZM40.16 13.469c-2.783 0-4.249-1.095-4.379-3.303h2.282c.13 1.188.724 1.633 2.134 1.633 1.261 0 1.892-.39 1.892-1.15 0-.687-.445-1.02-1.874-1.262l-1.094-.185c-2.097-.353-3.136-1.318-3.136-2.894 0-1.8 1.429-2.894 3.97-2.894 2.728 0 4.138 1.075 4.23 3.246h-2.207c-.056-1.169-.742-1.577-2.023-1.577-1.113 0-1.67.371-1.67 1.113 0 .668.483.965 1.596 1.169l1.206.186c2.32.426 3.32 1.28 3.32 2.912 0 1.93-1.557 3.006-4.247 3.006ZM54.667 13.209h-2.671l-2.783-4.453-1.447 1.447v3.006h-2.3V0h2.3v7.606l3.896-3.97h2.783l-3.618 3.618 3.84 5.955ZM60.772 6.048l.78-2.412H64l-3.692 10.352c-.39 1.057-.872 1.818-1.484 2.245-.612.426-1.484.63-2.634.63-.39 0-.724-.018-1.02-.055V14.97h.89c1.057 0 1.577-.65 1.577-1.54 0-.445-.149-1.094-.446-1.929l-2.746-7.866h2.487l.779 2.393c.575 1.8 1.076 3.58 1.521 5.343.408-1.521.928-3.302 1.54-5.324Z" d="M8.478 6.252c1.503.538 2.3 1.78 2.3 3.172 0 2.356-1.576 3.785-4.6 3.785H0V0h5.974c2.875 0 4.267 1.466 4.267 3.413 0 1.3-.594 2.245-1.763 2.839Zm-2.69-4.193H2.504v3.45h3.284c1.28 0 1.967-.667 1.967-1.78 0-1.02-.705-1.67-1.967-1.67Zm-3.284 9.072h3.544c1.41 0 2.17-.65 2.17-1.818 0-1.224-.723-1.837-2.17-1.837H2.504v3.655ZM14.251 13.209h-2.337V0h2.337v13.209ZM22.001 8.998V3.636h2.338v9.573h-2.263v-1.392c-.724 1.076-1.726 1.614-3.006 1.614-2.022 0-3.34-1.224-3.34-3.45V3.636h2.338v5.955c0 1.206.594 1.818 1.8 1.818 1.132 0 2.133-.835 2.133-2.411ZM34.979 8.59v.556h-7.161c.167 1.651 1.076 2.467 2.486 2.467 1.076 0 1.8-.463 2.189-1.372h2.244c-.5 1.947-2.17 3.19-4.452 3.19-1.428 0-2.579-.463-3.45-1.372-.872-.91-1.318-2.115-1.318-3.637 0-1.502.427-2.708 1.299-3.636.872-.909 2.004-1.372 3.432-1.372 1.447 0 2.597.482 3.45 1.428.854.946 1.28 2.208 1.28 3.747Zm-4.75-3.358c-1.28 0-2.17.742-2.393 2.281h4.805c-.204-1.391-1.057-2.281-2.411-2.281ZM40.16 13.469c-2.783 0-4.249-1.095-4.379-3.303h2.282c.13 1.188.724 1.633 2.134 1.633 1.261 0 1.892-.39 1.892-1.15 0-.687-.445-1.02-1.874-1.262l-1.094-.185c-2.097-.353-3.136-1.318-3.136-2.894 0-1.8 1.429-2.894 3.97-2.894 2.728 0 4.138 1.075 4.23 3.246h-2.207c-.056-1.169-.742-1.577-2.023-1.577-1.113 0-1.67.371-1.67 1.113 0 .668.483.965 1.596 1.169l1.206.186c2.32.426 3.32 1.28 3.32 2.912 0 1.93-1.557 3.006-4.247 3.006ZM54.667 13.209h-2.671l-2.783-4.453-1.447 1.447v3.006h-2.3V0h2.3v7.606l3.896-3.97h2.783l-3.618 3.618 3.84 5.955ZM60.772 6.048l.78-2.412H64l-3.692 10.352c-.39 1.057-.872 1.818-1.484 2.245-.612.426-1.484.63-2.634.63-.39 0-.724-.018-1.02-.055V14.97h.89c1.057 0 1.577-.65 1.577-1.54 0-.445-.149-1.094-.446-1.929l-2.746-7.866h2.487l.779 2.393c.575 1.8 1.076 3.58 1.521 5.343.408-1.521.928-3.302 1.54-5.324Z"
/> />
</Svg> </Svg>
+9 -4
View File
@@ -12,6 +12,7 @@ import {FeedPage} from 'view/com/feeds/FeedPage'
import {HomeLoggedOutCTA} from '../com/auth/HomeLoggedOutCTA' import {HomeLoggedOutCTA} from '../com/auth/HomeLoggedOutCTA'
import {useSetMinimalShellMode, useSetDrawerSwipeDisabled} from '#/state/shell' import {useSetMinimalShellMode, useSetDrawerSwipeDisabled} from '#/state/shell'
import {usePreferencesQuery} from '#/state/queries/preferences' import {usePreferencesQuery} from '#/state/queries/preferences'
import {usePinnedFeedsInfos, FeedSourceInfo} from '#/state/queries/feed'
import {UsePreferencesQueryResponse} from '#/state/queries/preferences/types' import {UsePreferencesQueryResponse} from '#/state/queries/preferences/types'
import {emitSoftReset} from '#/state/events' import {emitSoftReset} from '#/state/events'
import {useSession} from '#/state/session' import {useSession} from '#/state/session'
@@ -21,6 +22,7 @@ import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries'
type Props = NativeStackScreenProps<HomeTabNavigatorParams, 'Home'> type Props = NativeStackScreenProps<HomeTabNavigatorParams, 'Home'>
export function HomeScreen(props: Props) { export function HomeScreen(props: Props) {
const {data: preferences} = usePreferencesQuery() const {data: preferences} = usePreferencesQuery()
const {feeds: pinnedFeeds} = usePinnedFeedsInfos()
const {isDesktop} = useWebMediaQueries() const {isDesktop} = useWebMediaQueries()
const [initialPage, setInitialPage] = React.useState<string | undefined>( const [initialPage, setInitialPage] = React.useState<string | undefined>(
undefined, undefined,
@@ -39,11 +41,12 @@ export function HomeScreen(props: Props) {
loadLastActivePage() loadLastActivePage()
}, []) }, [])
if (preferences && initialPage !== undefined) { if (preferences && pinnedFeeds && initialPage !== undefined) {
return ( return (
<HomeScreenReady <HomeScreenReady
{...props} {...props}
preferences={preferences} preferences={preferences}
pinnedFeeds={pinnedFeeds}
initialPage={isDesktop ? 'Following' : initialPage} initialPage={isDesktop ? 'Following' : initialPage}
/> />
) )
@@ -58,9 +61,11 @@ export function HomeScreen(props: Props) {
function HomeScreenReady({ function HomeScreenReady({
preferences, preferences,
pinnedFeeds,
initialPage, initialPage,
}: Props & { }: Props & {
preferences: UsePreferencesQueryResponse preferences: UsePreferencesQueryResponse
pinnedFeeds: FeedSourceInfo[]
initialPage: string initialPage: string
}) { }) {
const {hasSession} = useSession() const {hasSession} = useSession()
@@ -82,9 +87,9 @@ function HomeScreenReady({
}, [preferences.feeds.pinned, selectedPage]) }, [preferences.feeds.pinned, selectedPage])
const customFeeds = React.useMemo(() => { const customFeeds = React.useMemo(() => {
const pinned = preferences.feeds.pinned const pinned = pinnedFeeds
const feeds: FeedDescriptor[] = [] const feeds: FeedDescriptor[] = []
for (const uri of pinned) { for (const {uri} of pinned) {
if (uri.includes('app.bsky.feed.generator')) { if (uri.includes('app.bsky.feed.generator')) {
feeds.push(`feedgen|${uri}`) feeds.push(`feedgen|${uri}`)
} else if (uri.includes('app.bsky.graph.list')) { } else if (uri.includes('app.bsky.graph.list')) {
@@ -92,7 +97,7 @@ function HomeScreenReady({
} }
} }
return feeds return feeds
}, [preferences.feeds.pinned]) }, [pinnedFeeds])
const homeFeedParams = React.useMemo<FeedParams>(() => { const homeFeedParams = React.useMemo<FeedParams>(() => {
return { return {
+3 -1
View File
@@ -24,11 +24,13 @@ import {useResolveUriQuery} from '#/state/queries/resolve-uri'
import {ErrorMessage} from '../com/util/error/ErrorMessage' import {ErrorMessage} from '../com/util/error/ErrorMessage'
import {CenteredView} from '../com/util/Views' import {CenteredView} from '../com/util/Views'
import {useComposerControls} from '#/state/shell/composer' import {useComposerControls} from '#/state/shell/composer'
import {useSession} from '#/state/session'
type Props = NativeStackScreenProps<CommonNavigatorParams, 'PostThread'> type Props = NativeStackScreenProps<CommonNavigatorParams, 'PostThread'>
export function PostThreadScreen({route}: Props) { export function PostThreadScreen({route}: Props) {
const queryClient = useQueryClient() const queryClient = useQueryClient()
const {_} = useLingui() const {_} = useLingui()
const {hasSession} = useSession()
const {fabMinimalShellTransform} = useMinimalShellMode() const {fabMinimalShellTransform} = useMinimalShellMode()
const setMinimalShellMode = useSetMinimalShellMode() const setMinimalShellMode = useSetMinimalShellMode()
const {openComposer} = useComposerControls() const {openComposer} = useComposerControls()
@@ -89,7 +91,7 @@ export function PostThreadScreen({route}: Props) {
/> />
)} )}
</View> </View>
{isMobile && canReply && ( {isMobile && canReply && hasSession && (
<Animated.View <Animated.View
style={[ style={[
styles.prompt, styles.prompt,
+19 -72
View File
@@ -1,14 +1,14 @@
import React, {useMemo, useCallback} from 'react' import React, {useMemo, useCallback} from 'react'
import {Dimensions, StyleSheet, View, ActivityIndicator} from 'react-native' import {Dimensions, StyleSheet, View, ActivityIndicator} from 'react-native'
import {NativeStackScreenProps} from '@react-navigation/native-stack' import {NativeStackScreenProps} from '@react-navigation/native-stack'
import {useNavigation} from '@react-navigation/native' import {useIsFocused, useNavigation} from '@react-navigation/native'
import {useQueryClient} from '@tanstack/react-query' import {useQueryClient} from '@tanstack/react-query'
import {usePalette} from 'lib/hooks/usePalette' import {usePalette} from 'lib/hooks/usePalette'
import {HeartIcon, HeartIconSolid} from 'lib/icons' import {HeartIcon, HeartIconSolid} from 'lib/icons'
import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome'
import {CommonNavigatorParams} from 'lib/routes/types' import {CommonNavigatorParams} from 'lib/routes/types'
import {makeRecordUri} from 'lib/strings/url-helpers' import {makeRecordUri} from 'lib/strings/url-helpers'
import {colors, s} from 'lib/styles' import {s} from 'lib/styles'
import {FeedDescriptor} from '#/state/queries/post-feed' import {FeedDescriptor} from '#/state/queries/post-feed'
import {PagerWithHeader} from 'view/com/pager/PagerWithHeader' import {PagerWithHeader} from 'view/com/pager/PagerWithHeader'
import {ProfileSubpageHeader} from 'view/com/profile/ProfileSubpageHeader' import {ProfileSubpageHeader} from 'view/com/profile/ProfileSubpageHeader'
@@ -42,11 +42,7 @@ import {logger} from '#/logger'
import {Trans, msg} from '@lingui/macro' import {Trans, msg} from '@lingui/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import {useModalControls} from '#/state/modals' import {useModalControls} from '#/state/modals'
import { import {useFeedSourceInfoQuery, FeedSourceFeedInfo} from '#/state/queries/feed'
useFeedSourceInfoQuery,
FeedSourceFeedInfo,
useIsFeedPublicQuery,
} from '#/state/queries/feed'
import {useResolveUriQuery} from '#/state/queries/resolve-uri' import {useResolveUriQuery} from '#/state/queries/resolve-uri'
import { import {
UsePreferencesQueryResponse, UsePreferencesQueryResponse,
@@ -132,10 +128,8 @@ export function ProfileFeedScreen(props: Props) {
function ProfileFeedScreenIntermediate({feedUri}: {feedUri: string}) { function ProfileFeedScreenIntermediate({feedUri}: {feedUri: string}) {
const {data: preferences} = usePreferencesQuery() const {data: preferences} = usePreferencesQuery()
const {data: info} = useFeedSourceInfoQuery({uri: feedUri}) const {data: info} = useFeedSourceInfoQuery({uri: feedUri})
const {isLoading: isPublicStatusLoading, data: isPublicResponse} =
useIsFeedPublicQuery({uri: feedUri})
if (!preferences || !info || isPublicStatusLoading) { if (!preferences || !info) {
return ( return (
<CenteredView> <CenteredView>
<View style={s.p20}> <View style={s.p20}>
@@ -149,7 +143,6 @@ function ProfileFeedScreenIntermediate({feedUri}: {feedUri: string}) {
<ProfileFeedScreenInner <ProfileFeedScreenInner
preferences={preferences} preferences={preferences}
feedInfo={info as FeedSourceFeedInfo} feedInfo={info as FeedSourceFeedInfo}
isPublicResponse={isPublicResponse}
/> />
) )
} }
@@ -157,11 +150,9 @@ function ProfileFeedScreenIntermediate({feedUri}: {feedUri: string}) {
export function ProfileFeedScreenInner({ export function ProfileFeedScreenInner({
preferences, preferences,
feedInfo, feedInfo,
isPublicResponse,
}: { }: {
preferences: UsePreferencesQueryResponse preferences: UsePreferencesQueryResponse
feedInfo: FeedSourceFeedInfo feedInfo: FeedSourceFeedInfo
isPublicResponse: ReturnType<typeof useIsFeedPublicQuery>['data']
}) { }) {
const {_} = useLingui() const {_} = useLingui()
const pal = usePalette('default') const pal = usePalette('default')
@@ -170,6 +161,7 @@ export function ProfileFeedScreenInner({
const {openComposer} = useComposerControls() const {openComposer} = useComposerControls()
const {track} = useAnalytics() const {track} = useAnalytics()
const feedSectionRef = React.useRef<SectionRef>(null) const feedSectionRef = React.useRef<SectionRef>(null)
const isScreenFocused = useIsFocused()
const { const {
mutateAsync: saveFeed, mutateAsync: saveFeed,
@@ -205,6 +197,9 @@ export function ProfileFeedScreenInner({
useSetTitle(feedInfo?.displayName) useSetTitle(feedInfo?.displayName)
// event handlers
//
const onToggleSaved = React.useCallback(async () => { const onToggleSaved = React.useCallback(async () => {
try { try {
Haptics.default() Haptics.default()
@@ -398,21 +393,15 @@ export function ProfileFeedScreenInner({
isHeaderReady={true} isHeaderReady={true}
renderHeader={renderHeader} renderHeader={renderHeader}
onCurrentPageSelected={onCurrentPageSelected}> onCurrentPageSelected={onCurrentPageSelected}>
{({headerHeight, scrollElRef, isFocused}) => {({headerHeight, scrollElRef, isFocused}) => (
isPublicResponse?.isPublic ? ( <FeedSection
<FeedSection ref={feedSectionRef}
ref={feedSectionRef} feed={`feedgen|${feedInfo.uri}`}
feed={`feedgen|${feedInfo.uri}`} headerHeight={headerHeight}
headerHeight={headerHeight} scrollElRef={scrollElRef as ListRef}
scrollElRef={scrollElRef as ListRef} isFocused={isScreenFocused && isFocused}
isFocused={isFocused} />
/> )}
) : (
<CenteredView sideBorders style={[{paddingTop: headerHeight}]}>
<NonPublicFeedMessage rawError={isPublicResponse?.error} />
</CenteredView>
)
}
{({headerHeight, scrollElRef}) => ( {({headerHeight, scrollElRef}) => (
<AboutSection <AboutSection
feedOwnerDid={feedInfo.creatorDid} feedOwnerDid={feedInfo.creatorDid}
@@ -446,45 +435,6 @@ export function ProfileFeedScreenInner({
) )
} }
function NonPublicFeedMessage({rawError}: {rawError?: Error}) {
const pal = usePalette('default')
return (
<View
style={[
pal.border,
{
padding: 18,
borderTopWidth: 1,
minHeight: Dimensions.get('window').height * 1.5,
},
]}>
<View
style={[
pal.viewLight,
{
padding: 12,
borderRadius: 8,
gap: 12,
},
]}>
<Text style={[pal.text]}>
<Trans>
Looks like this feed is only available to users with a Bluesky
account. Please sign up or sign in to view this feed!
</Trans>
</Text>
{rawError?.message && (
<Text style={pal.textLight}>
<Trans>Message from server</Trans>: {rawError.message}
</Text>
)}
</View>
</View>
)
}
interface FeedSectionProps { interface FeedSectionProps {
feed: FeedDescriptor feed: FeedDescriptor
headerHeight: number headerHeight: number
@@ -519,7 +469,7 @@ const FeedSection = React.forwardRef<SectionRef, FeedSectionProps>(
<Feed <Feed
enabled={isFocused} enabled={isFocused}
feed={feed} feed={feed}
pollInterval={30e3} pollInterval={60e3}
scrollElRef={scrollElRef} scrollElRef={scrollElRef}
onHasNew={setHasNew} onHasNew={setHasNew}
onScrolledDownChange={setIsScrolledDown} onScrolledDownChange={setIsScrolledDown}
@@ -630,7 +580,7 @@ function AboutSection({
onPress={onToggleLiked} onPress={onToggleLiked}
style={{paddingHorizontal: 10}}> style={{paddingHorizontal: 10}}>
{isLiked ? ( {isLiked ? (
<HeartIconSolid size={19} style={styles.liked} /> <HeartIconSolid size={19} style={s.likeColor} />
) : ( ) : (
<HeartIcon strokeWidth={3} size={19} style={pal.textLight} /> <HeartIcon strokeWidth={3} size={19} style={pal.textLight} />
)} )}
@@ -673,9 +623,6 @@ const styles = StyleSheet.create({
borderRadius: 50, borderRadius: 50,
marginLeft: 6, marginLeft: 6,
}, },
liked: {
color: colors.red3,
},
notFoundContainer: { notFoundContainer: {
margin: 10, margin: 10,
paddingHorizontal: 18, paddingHorizontal: 18,
+4 -3
View File
@@ -1,6 +1,6 @@
import React, {useCallback, useMemo} from 'react' import React, {useCallback, useMemo} from 'react'
import {ActivityIndicator, Pressable, StyleSheet, View} from 'react-native' import {ActivityIndicator, Pressable, StyleSheet, View} from 'react-native'
import {useFocusEffect} from '@react-navigation/native' import {useFocusEffect, useIsFocused} from '@react-navigation/native'
import {NativeStackScreenProps, CommonNavigatorParams} from 'lib/routes/types' import {NativeStackScreenProps, CommonNavigatorParams} from 'lib/routes/types'
import {useNavigation} from '@react-navigation/native' import {useNavigation} from '@react-navigation/native'
import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome'
@@ -115,6 +115,7 @@ function ProfileListScreenLoaded({
const aboutSectionRef = React.useRef<SectionRef>(null) const aboutSectionRef = React.useRef<SectionRef>(null)
const {openModal} = useModalControls() const {openModal} = useModalControls()
const isCurateList = list.purpose === 'app.bsky.graph.defs#curatelist' const isCurateList = list.purpose === 'app.bsky.graph.defs#curatelist'
const isScreenFocused = useIsFocused()
useSetTitle(list.name) useSetTitle(list.name)
@@ -165,7 +166,7 @@ function ProfileListScreenLoaded({
feed={`list|${uri}`} feed={`list|${uri}`}
scrollElRef={scrollElRef as ListRef} scrollElRef={scrollElRef as ListRef}
headerHeight={headerHeight} headerHeight={headerHeight}
isFocused={isFocused} isFocused={isScreenFocused && isFocused}
/> />
)} )}
{({headerHeight, scrollElRef}) => ( {({headerHeight, scrollElRef}) => (
@@ -623,7 +624,7 @@ const FeedSection = React.forwardRef<SectionRef, FeedSectionProps>(
testID="listFeed" testID="listFeed"
enabled={isFocused} enabled={isFocused}
feed={feed} feed={feed}
pollInterval={30e3} pollInterval={60e3}
scrollElRef={scrollElRef} scrollElRef={scrollElRef}
onHasNew={setHasNew} onHasNew={setHasNew}
onScrolledDownChange={setIsScrolledDown} onScrolledDownChange={setIsScrolledDown}
+11 -11
View File
@@ -221,18 +221,16 @@ let DrawerContent = ({}: {}): React.ReactNode => {
<NavSignupCard /> <NavSignupCard />
)} )}
{hasSession && <InviteCodes />} {hasSession ? (
{hasSession && <View style={{height: 10}} />}
<SearchMenuItem isActive={isAtSearch} onPress={onPressSearch} />
<HomeMenuItem isActive={isAtHome} onPress={onPressHome} />
{hasSession && (
<NotificationsMenuItem
isActive={isAtNotifications}
onPress={onPressNotifications}
/>
)}
{hasSession && (
<> <>
<InviteCodes />
<View style={{height: 10}} />
<SearchMenuItem isActive={isAtSearch} onPress={onPressSearch} />
<HomeMenuItem isActive={isAtHome} onPress={onPressHome} />
<NotificationsMenuItem
isActive={isAtNotifications}
onPress={onPressNotifications}
/>
<FeedsMenuItem isActive={isAtFeeds} onPress={onPressMyFeeds} /> <FeedsMenuItem isActive={isAtFeeds} onPress={onPressMyFeeds} />
<ListsMenuItem onPress={onPressLists} /> <ListsMenuItem onPress={onPressLists} />
<ModerationMenuItem onPress={onPressModeration} /> <ModerationMenuItem onPress={onPressModeration} />
@@ -242,6 +240,8 @@ let DrawerContent = ({}: {}): React.ReactNode => {
/> />
<SettingsMenuItem onPress={onPressSettings} /> <SettingsMenuItem onPress={onPressSettings} />
</> </>
) : (
<SearchMenuItem isActive={isAtSearch} onPress={onPressSearch} />
)} )}
<View style={styles.smallSpacer} /> <View style={styles.smallSpacer} />
+4 -4
View File
@@ -5,11 +5,11 @@ import {useLingui} from '@lingui/react'
import {s} from 'lib/styles' import {s} from 'lib/styles'
import {usePalette} from 'lib/hooks/usePalette' import {usePalette} from 'lib/hooks/usePalette'
import {DefaultAvatar} from '#/view/com/util/UserAvatar'
import {Text} from '#/view/com/util/text/Text' import {Text} from '#/view/com/util/text/Text'
import {Button} from '#/view/com/util/forms/Button' import {Button} from '#/view/com/util/forms/Button'
import {useLoggedOutViewControls} from '#/state/shell/logged-out' import {useLoggedOutViewControls} from '#/state/shell/logged-out'
import {useCloseAllActiveElements} from '#/state/util' import {useCloseAllActiveElements} from '#/state/util'
import {Logo} from '#/view/icons/Logo'
let NavSignupCard = ({}: {}): React.ReactNode => { let NavSignupCard = ({}: {}): React.ReactNode => {
const {_} = useLingui() const {_} = useLingui()
@@ -35,10 +35,10 @@ let NavSignupCard = ({}: {}): React.ReactNode => {
paddingTop: 6, paddingTop: 6,
marginBottom: 24, marginBottom: 24,
}}> }}>
<DefaultAvatar type="user" size={48} /> <Logo width={48} />
<View style={{paddingTop: 12}}> <View style={{paddingTop: 18}}>
<Text type="md" style={[pal.text, s.bold]}> <Text type="md-bold" style={[pal.text]}>
<Trans>Sign up or sign in to join the conversation</Trans> <Trans>Sign up or sign in to join the conversation</Trans>
</Text> </Text>
</View> </View>
+108 -47
View File
@@ -23,13 +23,19 @@ import {useMinimalShellMode} from 'lib/hooks/useMinimalShellMode'
import {useNavigationTabState} from 'lib/hooks/useNavigationTabState' import {useNavigationTabState} from 'lib/hooks/useNavigationTabState'
import {UserAvatar} from 'view/com/util/UserAvatar' import {UserAvatar} from 'view/com/util/UserAvatar'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import {msg} from '@lingui/macro' import {msg, Trans} from '@lingui/macro'
import {useModalControls} from '#/state/modals' import {useModalControls} from '#/state/modals'
import {useShellLayout} from '#/state/shell/shell-layout' import {useShellLayout} from '#/state/shell/shell-layout'
import {useUnreadNotifications} from '#/state/queries/notifications/unread' import {useUnreadNotifications} from '#/state/queries/notifications/unread'
import {emitSoftReset} from '#/state/events' import {emitSoftReset} from '#/state/events'
import {useSession} from '#/state/session' import {useSession} from '#/state/session'
import {useProfileQuery} from '#/state/queries/profile' import {useProfileQuery} from '#/state/queries/profile'
import {useLoggedOutViewControls} from '#/state/shell/logged-out'
import {useCloseAllActiveElements} from '#/state/util'
import {Button} from '#/view/com/util/forms/Button'
import {s} from 'lib/styles'
import {Logo} from '#/view/icons/Logo'
import {Logotype} from '#/view/icons/Logotype'
type TabOptions = 'Home' | 'Search' | 'Notifications' | 'MyProfile' | 'Feeds' type TabOptions = 'Home' | 'Search' | 'Notifications' | 'MyProfile' | 'Feeds'
@@ -46,6 +52,19 @@ export function BottomBar({navigation}: BottomTabBarProps) {
const numUnreadNotifications = useUnreadNotifications() const numUnreadNotifications = useUnreadNotifications()
const {footerMinimalShellTransform} = useMinimalShellMode() const {footerMinimalShellTransform} = useMinimalShellMode()
const {data: profile} = useProfileQuery({did: currentAccount?.did}) const {data: profile} = useProfileQuery({did: currentAccount?.did})
const {requestSwitchToAccount} = useLoggedOutViewControls()
const closeAllActiveElements = useCloseAllActiveElements()
const showSignIn = React.useCallback(() => {
closeAllActiveElements()
requestSwitchToAccount({requestedAccount: 'none'})
}, [requestSwitchToAccount, closeAllActiveElements])
const showCreateAccount = React.useCallback(() => {
closeAllActiveElements()
requestSwitchToAccount({requestedAccount: 'new'})
// setShowLoggedOut(true)
}, [requestSwitchToAccount, closeAllActiveElements])
const onPressTab = React.useCallback( const onPressTab = React.useCallback(
(tab: TabOptions) => { (tab: TabOptions) => {
@@ -94,53 +113,52 @@ export function BottomBar({navigation}: BottomTabBarProps) {
onLayout={e => { onLayout={e => {
footerHeight.value = e.nativeEvent.layout.height footerHeight.value = e.nativeEvent.layout.height
}}> }}>
<Btn {hasSession ? (
testID="bottomBarHomeBtn"
icon={
isAtHome ? (
<HomeIconSolid
strokeWidth={4}
size={24}
style={[styles.ctrlIcon, pal.text, styles.homeIcon]}
/>
) : (
<HomeIcon
strokeWidth={4}
size={24}
style={[styles.ctrlIcon, pal.text, styles.homeIcon]}
/>
)
}
onPress={onPressHome}
accessibilityRole="tab"
accessibilityLabel={_(msg`Home`)}
accessibilityHint=""
/>
<Btn
testID="bottomBarSearchBtn"
icon={
isAtSearch ? (
<MagnifyingGlassIcon2Solid
size={25}
style={[styles.ctrlIcon, pal.text, styles.searchIcon]}
strokeWidth={1.8}
/>
) : (
<MagnifyingGlassIcon2
size={25}
style={[styles.ctrlIcon, pal.text, styles.searchIcon]}
strokeWidth={1.8}
/>
)
}
onPress={onPressSearch}
accessibilityRole="search"
accessibilityLabel={_(msg`Search`)}
accessibilityHint=""
/>
{hasSession && (
<> <>
<Btn
testID="bottomBarHomeBtn"
icon={
isAtHome ? (
<HomeIconSolid
strokeWidth={4}
size={24}
style={[styles.ctrlIcon, pal.text, styles.homeIcon]}
/>
) : (
<HomeIcon
strokeWidth={4}
size={24}
style={[styles.ctrlIcon, pal.text, styles.homeIcon]}
/>
)
}
onPress={onPressHome}
accessibilityRole="tab"
accessibilityLabel={_(msg`Home`)}
accessibilityHint=""
/>
<Btn
testID="bottomBarSearchBtn"
icon={
isAtSearch ? (
<MagnifyingGlassIcon2Solid
size={25}
style={[styles.ctrlIcon, pal.text, styles.searchIcon]}
strokeWidth={1.8}
/>
) : (
<MagnifyingGlassIcon2
size={25}
style={[styles.ctrlIcon, pal.text, styles.searchIcon]}
strokeWidth={1.8}
/>
)
}
onPress={onPressSearch}
accessibilityRole="search"
accessibilityLabel={_(msg`Search`)}
accessibilityHint=""
/>
<Btn <Btn
testID="bottomBarFeedsBtn" testID="bottomBarFeedsBtn"
icon={ icon={
@@ -230,6 +248,49 @@ export function BottomBar({navigation}: BottomTabBarProps) {
accessibilityHint="" accessibilityHint=""
/> />
</> </>
) : (
<>
<View
style={{
width: '100%',
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingTop: 14,
paddingBottom: 2,
paddingLeft: 14,
paddingRight: 6,
gap: 8,
}}>
<View style={{flexDirection: 'row', alignItems: 'center', gap: 8}}>
<Logo width={28} />
<View style={{paddingTop: 4}}>
<Logotype width={80} fill={pal.text.color} />
</View>
</View>
<View style={{flexDirection: 'row', alignItems: 'center', gap: 4}}>
<Button
onPress={showCreateAccount}
accessibilityHint={_(msg`Sign up`)}
accessibilityLabel={_(msg`Sign up`)}>
<Text type="md" style={[{color: 'white'}, s.bold]}>
<Trans>Sign up</Trans>
</Text>
</Button>
<Button
type="default"
onPress={showSignIn}
accessibilityHint={_(msg`Sign in`)}
accessibilityLabel={_(msg`Sign in`)}>
<Text type="md" style={[pal.text, s.bold]}>
<Trans>Sign in</Trans>
</Text>
</Button>
</View>
</View>
</>
)} )}
</Animated.View> </Animated.View>
) )
+128 -57
View File
@@ -3,6 +3,9 @@ import {usePalette} from 'lib/hooks/usePalette'
import {useNavigationState} from '@react-navigation/native' import {useNavigationState} from '@react-navigation/native'
import Animated from 'react-native-reanimated' import Animated from 'react-native-reanimated'
import {useSafeAreaInsets} from 'react-native-safe-area-context' import {useSafeAreaInsets} from 'react-native-safe-area-context'
import {View} from 'react-native'
import {msg, Trans} from '@lingui/macro'
import {useLingui} from '@lingui/react'
import {getCurrentRoute, isTab} from 'lib/routes/helpers' import {getCurrentRoute, isTab} from 'lib/routes/helpers'
import {styles} from './BottomBarStyles' import {styles} from './BottomBarStyles'
import {clamp} from 'lib/numbers' import {clamp} from 'lib/numbers'
@@ -22,12 +25,33 @@ import {useMinimalShellMode} from 'lib/hooks/useMinimalShellMode'
import {makeProfileLink} from 'lib/routes/links' import {makeProfileLink} from 'lib/routes/links'
import {CommonNavigatorParams} from 'lib/routes/types' import {CommonNavigatorParams} from 'lib/routes/types'
import {useSession} from '#/state/session' import {useSession} from '#/state/session'
import {useLoggedOutViewControls} from '#/state/shell/logged-out'
import {useCloseAllActiveElements} from '#/state/util'
import {Button} from '#/view/com/util/forms/Button'
import {Text} from '#/view/com/util/text/Text'
import {s} from 'lib/styles'
import {Logo} from '#/view/icons/Logo'
import {Logotype} from '#/view/icons/Logotype'
export function BottomBarWeb() { export function BottomBarWeb() {
const {_} = useLingui()
const {hasSession, currentAccount} = useSession() const {hasSession, currentAccount} = useSession()
const pal = usePalette('default') const pal = usePalette('default')
const safeAreaInsets = useSafeAreaInsets() const safeAreaInsets = useSafeAreaInsets()
const {footerMinimalShellTransform} = useMinimalShellMode() const {footerMinimalShellTransform} = useMinimalShellMode()
const {requestSwitchToAccount} = useLoggedOutViewControls()
const closeAllActiveElements = useCloseAllActiveElements()
const showSignIn = React.useCallback(() => {
closeAllActiveElements()
requestSwitchToAccount({requestedAccount: 'none'})
}, [requestSwitchToAccount, closeAllActiveElements])
const showCreateAccount = React.useCallback(() => {
closeAllActiveElements()
requestSwitchToAccount({requestedAccount: 'new'})
// setShowLoggedOut(true)
}, [requestSwitchToAccount, closeAllActiveElements])
return ( return (
<Animated.View <Animated.View
@@ -39,79 +63,126 @@ export function BottomBarWeb() {
{paddingBottom: clamp(safeAreaInsets.bottom, 15, 30)}, {paddingBottom: clamp(safeAreaInsets.bottom, 15, 30)},
footerMinimalShellTransform, footerMinimalShellTransform,
]}> ]}>
<NavItem routeName="Home" href="/"> {hasSession ? (
{({isActive}) => {
const Icon = isActive ? HomeIconSolid : HomeIcon
return (
<Icon
strokeWidth={4}
size={24}
style={[styles.ctrlIcon, pal.text, styles.homeIcon]}
/>
)
}}
</NavItem>
<NavItem routeName="Search" href="/search">
{({isActive}) => {
const Icon = isActive
? MagnifyingGlassIcon2Solid
: MagnifyingGlassIcon2
return (
<Icon
size={25}
style={[styles.ctrlIcon, pal.text, styles.searchIcon]}
strokeWidth={1.8}
/>
)
}}
</NavItem>
{hasSession && (
<> <>
<NavItem routeName="Feeds" href="/feeds"> <NavItem routeName="Home" href="/">
{({isActive}) => { {({isActive}) => {
return ( const Icon = isActive ? HomeIconSolid : HomeIcon
<HashtagIcon
size={22}
style={[styles.ctrlIcon, pal.text, styles.feedsIcon]}
strokeWidth={isActive ? 4 : 2.5}
/>
)
}}
</NavItem>
<NavItem routeName="Notifications" href="/notifications">
{({isActive}) => {
const Icon = isActive ? BellIconSolid : BellIcon
return ( return (
<Icon <Icon
strokeWidth={4}
size={24} size={24}
strokeWidth={1.9} style={[styles.ctrlIcon, pal.text, styles.homeIcon]}
style={[styles.ctrlIcon, pal.text, styles.bellIcon]}
/> />
) )
}} }}
</NavItem> </NavItem>
<NavItem <NavItem routeName="Search" href="/search">
routeName="Profile"
href={
currentAccount
? makeProfileLink({
did: currentAccount.did,
handle: currentAccount.handle,
})
: '/'
}>
{({isActive}) => { {({isActive}) => {
const Icon = isActive ? UserIconSolid : UserIcon const Icon = isActive
? MagnifyingGlassIcon2Solid
: MagnifyingGlassIcon2
return ( return (
<Icon <Icon
size={28} size={25}
strokeWidth={1.5} style={[styles.ctrlIcon, pal.text, styles.searchIcon]}
style={[styles.ctrlIcon, pal.text, styles.profileIcon]} strokeWidth={1.8}
/> />
) )
}} }}
</NavItem> </NavItem>
{hasSession && (
<>
<NavItem routeName="Feeds" href="/feeds">
{({isActive}) => {
return (
<HashtagIcon
size={22}
style={[styles.ctrlIcon, pal.text, styles.feedsIcon]}
strokeWidth={isActive ? 4 : 2.5}
/>
)
}}
</NavItem>
<NavItem routeName="Notifications" href="/notifications">
{({isActive}) => {
const Icon = isActive ? BellIconSolid : BellIcon
return (
<Icon
size={24}
strokeWidth={1.9}
style={[styles.ctrlIcon, pal.text, styles.bellIcon]}
/>
)
}}
</NavItem>
<NavItem
routeName="Profile"
href={
currentAccount
? makeProfileLink({
did: currentAccount.did,
handle: currentAccount.handle,
})
: '/'
}>
{({isActive}) => {
const Icon = isActive ? UserIconSolid : UserIcon
return (
<Icon
size={28}
strokeWidth={1.5}
style={[styles.ctrlIcon, pal.text, styles.profileIcon]}
/>
)
}}
</NavItem>
</>
)}
</>
) : (
<>
<View
style={{
width: '100%',
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingTop: 14,
paddingBottom: 2,
paddingLeft: 14,
paddingRight: 6,
gap: 8,
}}>
<View style={{flexDirection: 'row', alignItems: 'center', gap: 12}}>
<Logo width={32} />
<View style={{paddingTop: 4}}>
<Logotype width={80} fill={pal.text.color} />
</View>
</View>
<View style={{flexDirection: 'row', alignItems: 'center', gap: 8}}>
<Button
onPress={showCreateAccount}
accessibilityHint={_(msg`Sign up`)}
accessibilityLabel={_(msg`Sign up`)}>
<Text type="md" style={[{color: 'white'}, s.bold]}>
<Trans>Sign up</Trans>
</Text>
</Button>
<Button
type="default"
onPress={showSignIn}
accessibilityHint={_(msg`Sign in`)}
accessibilityLabel={_(msg`Sign in`)}>
<Text type="md" style={[pal.text, s.bold]}>
<Trans>Sign in</Trans>
</Text>
</Button>
</View>
</View>
</> </>
)} )}
</Animated.View> </Animated.View>
+37 -34
View File
@@ -266,6 +266,10 @@ export function DesktopLeftNav() {
const {isDesktop, isTablet} = useWebMediaQueries() const {isDesktop, isTablet} = useWebMediaQueries()
const numUnread = useUnreadNotifications() const numUnread = useUnreadNotifications()
if (!hasSession && !isDesktop) {
return null
}
return ( return (
<View <View
style={[ style={[
@@ -282,40 +286,40 @@ export function DesktopLeftNav() {
</View> </View>
) : null} ) : null}
<BackBtn />
<NavItem
href="/"
icon={<HomeIcon size={isDesktop ? 24 : 28} style={pal.text} />}
iconFilled={
<HomeIconSolid
strokeWidth={4}
size={isDesktop ? 24 : 28}
style={pal.text}
/>
}
label={_(msg`Home`)}
/>
<NavItem
href="/search"
icon={
<MagnifyingGlassIcon2
strokeWidth={2}
size={isDesktop ? 24 : 26}
style={pal.text}
/>
}
iconFilled={
<MagnifyingGlassIcon2Solid
strokeWidth={2}
size={isDesktop ? 24 : 26}
style={pal.text}
/>
}
label={_(msg`Search`)}
/>
{hasSession && ( {hasSession && (
<> <>
<BackBtn />
<NavItem
href="/"
icon={<HomeIcon size={isDesktop ? 24 : 28} style={pal.text} />}
iconFilled={
<HomeIconSolid
strokeWidth={4}
size={isDesktop ? 24 : 28}
style={pal.text}
/>
}
label={_(msg`Home`)}
/>
<NavItem
href="/search"
icon={
<MagnifyingGlassIcon2
strokeWidth={2}
size={isDesktop ? 24 : 26}
style={pal.text}
/>
}
iconFilled={
<MagnifyingGlassIcon2Solid
strokeWidth={2}
size={isDesktop ? 24 : 26}
style={pal.text}
/>
}
label={_(msg`Search`)}
/>
<NavItem <NavItem
href="/feeds" href="/feeds"
icon={ icon={
@@ -405,7 +409,7 @@ export function DesktopLeftNav() {
style={pal.text} style={pal.text}
/> />
} }
label="Profile" label={_(msg`Profile`)}
/> />
<NavItem <NavItem
href="/settings" href="/settings"
@@ -512,7 +516,6 @@ const styles = StyleSheet.create({
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
justifyContent: 'center', justifyContent: 'center',
width: 140,
borderRadius: 24, borderRadius: 24,
paddingTop: 10, paddingTop: 10,
paddingBottom: 12, // visually aligns the text vertically inside the button paddingBottom: 12, // visually aligns the text vertically inside the button
+1 -1
View File
@@ -52,7 +52,7 @@ export function DesktopRightNav() {
</Text> </Text>
</View> </View>
) : undefined} ) : undefined}
<View style={[s.flexRow]}> <View style={[{flexWrap: 'wrap'}, s.flexRow]}>
{hasSession && ( {hasSession && (
<> <>
<TextLink <TextLink