diff --git a/Makefile b/Makefile index ae5a12eb8d..c90abb783e 100644 --- a/Makefile +++ b/Makefile @@ -10,6 +10,7 @@ help: ## Print info about all commands .PHONY: build-web build-web: ## Compile web bundle, copy to bskyweb directory + yarn intl:build yarn build-web .PHONY: test diff --git a/app.config.js b/app.config.js index 096756b084..ea41b4905e 100644 --- a/app.config.js +++ b/app.config.js @@ -9,12 +9,12 @@ module.exports = function () { /** * iOS build number. Must be incremented for each TestFlight version. */ - const IOS_BUILD_NUMBER = '2' + const IOS_BUILD_NUMBER = '4' /** * Android build number. Must be incremented for each release. */ - const ANDROID_VERSION_CODE = 49 + const ANDROID_VERSION_CODE = 50 /** * Uses built-in Expo env vars @@ -43,7 +43,7 @@ module.exports = function () { icon: './assets/icon.png', userInterfaceStyle: 'automatic', splash: { - image: './assets/cloud-splash.png', + image: './assets/splash.png', resizeMode: 'cover', backgroundColor: '#ffffff', }, @@ -73,9 +73,12 @@ module.exports = function () { }, android: { versionCode: ANDROID_VERSION_CODE, + icon: './assets/icon.png', adaptiveIcon: { - foregroundImage: './assets/adaptive-icon.png', - backgroundColor: '#ffffff', + foregroundImage: './assets/icon-android-foreground.png', + monochromeImage: './assets/icon-android-foreground.png', + backgroundImage: './assets/icon-android-background.png', + backgroundColor: '#1185FE', }, googleServicesFile: './google-services.json', package: 'xyz.blueskyweb.app', diff --git a/assets/adaptive-icon.png b/assets/adaptive-icon.png deleted file mode 100644 index 1dda9a342c..0000000000 Binary files a/assets/adaptive-icon.png and /dev/null differ diff --git a/assets/cloud-splash.png b/assets/cloud-splash.png deleted file mode 100644 index 188625331d..0000000000 Binary files a/assets/cloud-splash.png and /dev/null differ diff --git a/assets/default-avatar.jpg b/assets/default-avatar.jpg deleted file mode 100644 index ab141651e7..0000000000 Binary files a/assets/default-avatar.jpg and /dev/null differ diff --git a/assets/default-avatar.png b/assets/default-avatar.png new file mode 100644 index 0000000000..d2bd03842f Binary files /dev/null and b/assets/default-avatar.png differ diff --git a/assets/favicon.png b/assets/favicon.png index 24ec61e0a5..ddf55f4c81 100644 Binary files a/assets/favicon.png and b/assets/favicon.png differ diff --git a/assets/icon-android-background.png b/assets/icon-android-background.png new file mode 100644 index 0000000000..d6027131bb Binary files /dev/null and b/assets/icon-android-background.png differ diff --git a/assets/icon-android-foreground.png b/assets/icon-android-foreground.png new file mode 100644 index 0000000000..61e788747f Binary files /dev/null and b/assets/icon-android-foreground.png differ diff --git a/assets/icon.png b/assets/icon.png index 1dda9a342c..5d8ae67df8 100644 Binary files a/assets/icon.png and b/assets/icon.png differ diff --git a/assets/splash.png b/assets/splash.png new file mode 100644 index 0000000000..fbba8e258a Binary files /dev/null and b/assets/splash.png differ diff --git a/assets/tabs-explainer.jpg b/assets/tabs-explainer.jpg deleted file mode 100644 index 64f0a8fe5b..0000000000 Binary files a/assets/tabs-explainer.jpg and /dev/null differ diff --git a/bskyweb/Makefile b/bskyweb/Makefile index e0ba8aec06..6f979fa849 100644 --- a/bskyweb/Makefile +++ b/bskyweb/Makefile @@ -42,4 +42,4 @@ check: ## Compile everything, checking syntax (does not output binaries) .PHONY: run-dev-bskyweb 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 diff --git a/bskyweb/cmd/bskyweb/rss.go b/bskyweb/cmd/bskyweb/rss.go new file mode 100644 index 0000000000..f7caf8fe75 --- /dev/null +++ b/bskyweb/cmd/bskyweb/rss.go @@ -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) +} diff --git a/bskyweb/cmd/bskyweb/server.go b/bskyweb/cmd/bskyweb/server.go index 6cf54a9ef4..5d9a481fe2 100644 --- a/bskyweb/cmd/bskyweb/server.go +++ b/bskyweb/cmd/bskyweb/server.go @@ -15,7 +15,8 @@ import ( "time" 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/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/liked-by", server.WebGeneric) + // profile RSS feed (DID not handle) + e.GET("/profile/:did/rss", server.WebProfileRSS) + // post endpoints; only first populates info e.GET("/profile/:handle/post/:rkey", server.WebPost) 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 { + ctx := c.Request().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 { - did := pv.Did - data["did"] = did + // sanity check arguments. don't 4xx, just let app handle if not expected format + rkeyParam := c.Param("rkey") + 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) - uri := fmt.Sprintf("at://%s/app.bsky.feed.post/%s", did, rkey) - tpv, err := appbsky.FeedGetPostThread(ctx, srv.xrpcc, 1, uri) - if err != nil { - log.Warnf("failed to fetch post: %s\t%v", uri, err) - } else { - 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 - } - } - } + // requires two fetches: first fetch profile (!) + pv, err := appbsky.ActorGetProfile(ctx, srv.xrpcc, handle.String()) + if err != nil { + log.Warnf("failed to fetch handle: %s\t%v", handle, err) + return c.Render(http.StatusOK, "post.html", data) + } + unauthedViewingOkay := true + for _, label := range pv.Labels { + if label.Src == pv.Did && label.Val == "!no-unauthenticated" { + unauthedViewingOkay = false } + } + 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) } func (srv *Server) WebProfile(c echo.Context) error { + ctx := c.Request().Context() data := pongo2.Context{} - handle := c.Param("handle") - // sanity check argument - if len(handle) > 4 && len(handle) < 128 { - ctx := c.Request().Context() - 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 { - req := c.Request() - data["profileView"] = pv - data["requestURI"] = fmt.Sprintf("https://%s%s", req.Host, req.URL.Path) - } + + // sanity check arguments. don't 4xx, just let app handle if not expected format + handleParam := c.Param("handle") + handle, err := syntax.ParseHandle(handleParam) + if err != nil { + return c.Render(http.StatusOK, "profile.html", data) + } + handle = handle.Normalize() + + pv, err := appbsky.ActorGetProfile(ctx, srv.xrpcc, handle.String()) + if err != nil { + log.Warnf("failed to fetch handle: %s\t%v", handle, err) + return c.Render(http.StatusOK, "profile.html", data) + } + unauthedViewingOkay := true + for _, label := range pv.Labels { + if label.Src == pv.Did && label.Val == "!no-unauthenticated" { + 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) } diff --git a/bskyweb/example.env b/bskyweb/example.env index f8a45d7fc0..80adc15550 100644 --- a/bskyweb/example.env +++ b/bskyweb/example.env @@ -1,2 +1,2 @@ GOLOG_LOG_LEVEL=info -ATP_APPVIEW_HOST=https://api.bsky.app +ATP_APPVIEW_HOST=https://public.api.bsky.app diff --git a/bskyweb/go.mod b/bskyweb/go.mod index bc513727c7..0989217cac 100644 --- a/bskyweb/go.mod +++ b/bskyweb/go.mod @@ -3,88 +3,104 @@ module github.com/bluesky-social/social-app/bskyweb go 1.21 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/ipfs/go-log v1.0.5 github.com/joho/godotenv v1.5.1 - github.com/klauspost/compress v1.16.5 - github.com/labstack/echo/v4 v4.10.2 - github.com/urfave/cli/v2 v2.25.3 + github.com/klauspost/compress v1.17.3 + github.com/labstack/echo/v4 v4.11.3 + github.com/urfave/cli/v2 v2.25.7 ) require ( - github.com/benbjohnson/clock v1.3.0 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect + github.com/beorn7/perks v1.0.1 // 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/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/goccy/go-json v0.10.2 // indirect github.com/gogo/protobuf v1.3.2 // 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-retryablehttp v0.7.2 // indirect - github.com/hashicorp/golang-lru v0.5.4 // indirect + github.com/hashicorp/go-retryablehttp v0.7.5 // 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/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-datastore v0.6.0 // indirect - github.com/ipfs/go-ipfs-blockstore v1.3.0 // indirect - github.com/ipfs/go-ipfs-ds-help v1.1.0 // indirect - github.com/ipfs/go-ipfs-util v0.0.2 // indirect - github.com/ipfs/go-ipld-cbor v0.0.7-0.20230126201833-a73d038d90bc // indirect - github.com/ipfs/go-ipld-format v0.4.0 // indirect + github.com/ipfs/go-ipfs-blockstore v1.3.1 // indirect + github.com/ipfs/go-ipfs-ds-help v1.1.1 // indirect + github.com/ipfs/go-ipfs-util v0.0.3 // indirect + github.com/ipfs/go-ipld-cbor v0.1.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-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/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/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect - github.com/klauspost/cpuid/v2 v2.2.4 // indirect - github.com/labstack/gommon v0.4.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.6 // indirect + github.com/labstack/gommon v0.4.1 // indirect github.com/lestrrat-go/blackmagic 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/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/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.18 // indirect - github.com/mattn/go-sqlite3 v1.14.16 // indirect - github.com/minio/sha256-simd v1.0.0 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-sqlite3 v1.14.18 // 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/mr-tron/base58 v1.2.0 // indirect github.com/multiformats/go-base32 v0.1.0 // indirect github.com/multiformats/go-base36 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/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/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/segmentio/asm v1.2.0 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasttemplate v1.2.2 // indirect - github.com/whyrusleeping/cbor-gen v0.0.0-20230418232409-daab9ece03a0 // indirect - github.com/whyrusleeping/go-did v0.0.0-20230301193428-2146016fc220 // indirect + github.com/whyrusleeping/cbor-gen v0.0.0-20230923211252-36a87e1ba72f // indirect + github.com/whyrusleeping/go-did v0.0.0-20230824162731-404d1707d5d6 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect - go.opentelemetry.io/otel v1.15.1 // indirect - go.opentelemetry.io/otel/trace v1.15.1 // indirect + gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b // 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/multierr v1.11.0 // indirect - go.uber.org/zap v1.24.0 // indirect - golang.org/x/crypto v0.8.0 // indirect - golang.org/x/net v0.9.0 // indirect - golang.org/x/sys v0.7.0 // indirect - golang.org/x/text v0.9.0 // indirect + go.uber.org/zap v1.26.0 // indirect + golang.org/x/crypto v0.15.0 // indirect + golang.org/x/net v0.18.0 // indirect + golang.org/x/sync v0.5.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/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/sqlite v1.5.0 // indirect - gorm.io/gorm v1.25.0 // indirect - lukechampine.com/blake3 v1.1.7 // indirect + gorm.io/driver/sqlite v1.5.4 // indirect + gorm.io/gorm v1.25.5 // indirect + lukechampine.com/blake3 v1.2.1 // indirect ) diff --git a/bskyweb/go.sum b/bskyweb/go.sum index a07e446f4a..59797e35db 100644 --- a/bskyweb/go.sum +++ b/bskyweb/go.sum @@ -1,25 +1,30 @@ 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.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= -github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/bluesky-social/indigo v0.0.0-20230504025040-8915cccc3319 h1:VCNXRXpgyK3xkaQ8fzL5WzswerwLycke4B9ggLs1uOA= -github.com/bluesky-social/indigo v0.0.0-20230504025040-8915cccc3319/go.mod h1:Hc09SUJXAIujaAvq7JXxi8ZQQI887grzPkHgn4JyE1Q= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bluesky-social/indigo v0.0.0-20231216010655-ad730a7da4f5 h1:Zk1c+mxCYH6G/vLL0+9lO2Eci4OT3AFy73qPWa9auDM= +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.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= +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/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/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/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= 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/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/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.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +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/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= 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/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/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.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +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/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.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/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/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/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-retryablehttp v0.7.2 h1:AcYqCvkpalPnPF2pn0KamgwamS42TqUDDYFRKq/RAd0= -github.com/hashicorp/go-retryablehttp v0.7.2/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= -github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/go-retryablehttp v0.7.5 h1:bJj+Pj19UZMIweq/iie+1u5YCdGrnxCT9yvm0e+Nd5M= +github.com/hashicorp/go-retryablehttp v0.7.5/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +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/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.1.2 h1:GAjkfhVx1f4YTODS6Esrj1wt2HhrtwTnhEr+DyPUaJo= -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-block-format v0.2.0 h1:ZqrkxBA2ICbDRbK8KJs/u0O3dlp6gmAuuXUJNiW1Ycs= +github.com/ipfs/go-block-format v0.2.0/go.mod h1:+jpL11nFx5A/SPpsoBn6Bzkra/zaArfSmsknbPMYgzM= 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/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/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/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.0/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.0 h1:yLE2w9RAsl31LtfMt91tRZcrx+e61O5mDxFRR994w4Q= -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.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= -github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= -github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= -github.com/ipfs/go-ipld-cbor v0.0.7-0.20230126201833-a73d038d90bc h1:eUEo764smNy0EVRuMTSmirmuh552Mf2aBjfpDcLnDa8= -github.com/ipfs/go-ipld-cbor v0.0.7-0.20230126201833-a73d038d90bc/go.mod h1:X7SgEIwC4COC5OWfcepZBWafO5kA1Rmt9ZsLLbhihQk= -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-ipfs-blockstore v1.3.1 h1:cEI9ci7V0sRNivqaOr0elDsamxXFxJMMMy7PTTDQNsQ= +github.com/ipfs/go-ipfs-blockstore v1.3.1/go.mod h1:KgtZyc9fq+P2xJUiCAzbRdhhqJHvsw8u2Dlqy2MyRTE= +github.com/ipfs/go-ipfs-ds-help v1.1.1 h1:B5UJOH52IbcfS56+Ul+sv8jnIV10lbjLF5eOO0C66Nw= +github.com/ipfs/go-ipfs-ds-help v1.1.1/go.mod h1:75vrVCkSdSFidJscs8n4W+77AtTpCIAdDGAwjitJMIo= +github.com/ipfs/go-ipfs-util v0.0.3 h1:2RFdGez6bu2ZlZdI+rWfIdbQb1KudQp3VGwPtdNCmE0= +github.com/ipfs/go-ipfs-util v0.0.3/go.mod h1:LHzG1a0Ig4G+iZ26UUOMjHd+lfM84LZCrn17xAKWBvs= +github.com/ipfs/go-ipld-cbor v0.1.0 h1:dx0nS0kILVivGhfWuB6dUpMa/LAwElHPw1yOGYopoYs= +github.com/ipfs/go-ipld-cbor v0.1.0/go.mod h1:U2aYlmVrJr2wsUBU67K4KgepApSZddGRDWBYR0H4sCk= +github.com/ipfs/go-ipld-format v0.6.0 h1:VEJlA2kQ3LqFSIm5Vu6eIlSxD/Ze90xtc4Meten1F5U= +github.com/ipfs/go-ipld-format v0.6.0/go.mod h1:g4QVMTn3marU3qXchwjpKPKgJv+zF+OlaKMyhJ4LHPg= 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/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-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/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/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/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.1 h1:Fcr8QJ1ZeLi5zsPZqQeUZhNhxfkkKBOgJuYkJHoBOtU= -github.com/jackc/pgx/v5 v5.3.1/go.mod h1:t3JDKnCBlYIc0ewLF0Q7B8MXmoIaBOZj/ic7iHozM/8= +github.com/jackc/pgx/v5 v5.5.0 h1:NxstgwndsTRy7eq9/kqYc/BZh5w2hHJV86wjvO+1xPw= +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.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/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= 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/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/klauspost/compress v1.16.5 h1:IFV2oUNUzZaz+XyusxpLzpzS8Pt5rh0Z16For/djlyI= -github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -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/klauspost/compress v1.17.3 h1:qkRjuerhUU1EmXLYGkSH6EZL+vPSxIrYjLNAK4slzwA= +github.com/klauspost/compress v1.17.3/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= +github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc= +github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= 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.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= 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/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/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/labstack/echo/v4 v4.10.2 h1:n1jAhnq/elIFTHr1EYpiYtyKgx4RW9ccVgkqByZaN2M= -github.com/labstack/echo/v4 v4.10.2/go.mod h1:OEyqf2//K1DFdE57vw2DRgWY0M7s65IVQO2FzvI4J5k= -github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8= -github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= +github.com/labstack/echo/v4 v4.11.3 h1:Upyu3olaqSHkCjs1EJJwQ3WId8b8b1hxbogyommKktM= +github.com/labstack/echo/v4 v4.11.3/go.mod h1:UcGuQ8V6ZNRmSweBIJkPvGfwCMIlFmiqrPqiEBfPYws= +github.com/labstack/gommon v0.4.1 h1:gqEff0p/hTENGMABzezPoPSRtIh1Cvw0ueMOe0/dfOk= +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/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU= 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/iter v1.0.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzltI= 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.9/go.mod h1:K68euYaR95FnL0hIQB8VvzL70vB7pSifbJUydCTPmgM= +github.com/lestrrat-go/jwx/v2 v2.0.12 h1:3d589+5w/b9b7S3DneICPW16AqTyYXB7VRjgluSDWeA= +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.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU= 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/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.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98= -github.com/mattn/go-isatty v0.0.18/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.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= -github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-sqlite3 v1.14.18 h1:JL0eqdCOq6DJVNPSvArO/bIV9/P7fbGrV00LZHc+5aI= +github.com/mattn/go-sqlite3 v1.14.18/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/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 v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= -github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= +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/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= 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.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= 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.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= 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.2.1 h1:aem8ZT0VA2nCHHk7bPJ1BjUbHNciqZC/d16Vve9l108= -github.com/multiformats/go-multihash v0.2.1/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc= +github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= +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.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= 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/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= 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/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/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.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.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.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= 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/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs= 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.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.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +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/v2 v2.25.3 h1:VJkt6wvEBOoSjPFQvOkv6iWIrsJyCrKGtCtxXWwmGeY= -github.com/urfave/cli/v2 v2.25.3/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= +github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= +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/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/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/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-20230418232409-daab9ece03a0/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-20230301193428-2146016fc220/go.mod h1:qPtRyexGM5XMHFIfjH+EiA/A/1n2JakWEdMPC53pJAE= +github.com/whyrusleeping/cbor-gen v0.0.0-20230923211252-36a87e1ba72f h1:SBuSxXJL0/ZJMtTxbXZgHZkThl9dNrzyaNhlyaqscRo= +github.com/whyrusleeping/cbor-gen v0.0.0-20230923211252-36a87e1ba72f/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/go-did v0.0.0-20230824162731-404d1707d5d6 h1:yJ9/LwIGIk/c0CdoavpC9RNSGSruIspSZtxG3Nnldic= +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/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= 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.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.opentelemetry.io/otel v1.15.1 h1:3Iwq3lfRByPaws0f6bU3naAqOR1n5IeDWd9390kWHa8= -go.opentelemetry.io/otel v1.15.1/go.mod h1:mHHGEHVDLal6YrKMmk9LqC4a3sF5g+fHfrttQIB1NTc= -go.opentelemetry.io/otel/trace v1.15.1 h1:uXLo6iHJEzDfrNC0L0mNjItIp06SyaBQxu5t3xMlngY= -go.opentelemetry.io/otel/trace v1.15.1/go.mod h1:IWdQG/5N1x7f6YUlmdLeJvH9yxtuJAfc4VW5Agv9r/8= +gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b h1:CzigHMRySiX3drau9C6Q5CAbNIApmLdat5jPMqChvDA= +gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b/go.mod h1:/y/V339mxv2sZmYYR64O07VuCpdNZqCTwO8ZcouTMI8= +gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02 h1:qwDnMxjkyLmAFgcfgTnfJrmYKWhHnci3GjDqcZp1M3Q= +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.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/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 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= +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.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= 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/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.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= 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-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-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.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ= -golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= +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/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= 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-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.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= +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-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-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.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-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-20200930185726-fdedc70b468f/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-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-20210927094055-39ccf1dd6fa6/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-20220412211240-33da011f77ad/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-20220811171246-fbc7d0a398ab/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.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.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-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.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.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.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.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/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 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-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-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +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 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/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= 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= gorm.io/driver/postgres v1.5.0 h1:u2FXTy14l45qc3UeCJ7QaAXZmZfDDv0YrthvmRq1l0U= 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.0/go.mod h1:kDMDfntV9u/vuMmz8APHtHF0b4nyBB7sfCieC6G8k8I= +gorm.io/driver/sqlite v1.5.4 h1:IqXwXi8M/ZlPzH/947tn5uik3aYQslP9BVveoax0nV0= +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.25.0 h1:+KtYtb2roDz14EQe4bla8CbQlmb9dN3VejSai3lprfU= -gorm.io/gorm v1.25.0/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= +gorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls= +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= -lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0= -lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= +lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI= +lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= diff --git a/bskyweb/templates/home.html b/bskyweb/templates/home.html index 7beea49d9f..e06b3a4b08 100644 --- a/bskyweb/templates/home.html +++ b/bskyweb/templates/home.html @@ -8,6 +8,7 @@ + {%- endblock %} diff --git a/bskyweb/templates/post.html b/bskyweb/templates/post.html index 25a68c9718..55a0679fbd 100644 --- a/bskyweb/templates/post.html +++ b/bskyweb/templates/post.html @@ -10,8 +10,9 @@ {% block html_head_extra -%} {%- if postView -%} - + + {%- if requestURI %} {% endif -%} @@ -32,17 +33,20 @@ {% endif %} - - + + {% endif -%} {%- endblock %} {% block noscript_extra -%} +{%- if postView -%}

Post

{{ postView.Author.DisplayName }}

{{ postView.Author.Handle }}

{{ postView.Author.Did }}

{{ postView.Record.Val.Text }}

+

{{ postView.IndexedAt }}

+{% endif -%} {%- endblock %} diff --git a/bskyweb/templates/profile.html b/bskyweb/templates/profile.html index 4d4f679466..71c1003278 100644 --- a/bskyweb/templates/profile.html +++ b/bskyweb/templates/profile.html @@ -10,8 +10,9 @@ {% block html_head_extra -%} {%- if profileView -%} - + + {%- if requestURI %} {% endif -%} @@ -33,11 +34,12 @@ {% endif %} - + {% endif -%} {%- endblock %} {% block noscript_extra -%} +{%- if profileView -%}

Profile

{{ profileView.DisplayName }}

@@ -45,4 +47,5 @@

{{ profileView.Did }}

{{ profileView.Description }}

+{% endif -%} {%- endblock %} diff --git a/docs/build.md b/docs/build.md index 2bf7324b9d..c0ffefeefb 100644 --- a/docs/build.md +++ b/docs/build.md @@ -10,6 +10,7 @@ - After initial setup: - Copy `google-services.json.example` to `google-services.json` or provide your own `google-services.json`. (A real firebase project is NOT required) - `npx expo prebuild` -> you will also need to run this anytime `app.json` or native `package.json` deps change + - `yarn intl:build` -> you will also need to run this anytime `./src/locale/{locale}/messages.po` change - Start the dev servers - `git clone git@github.com:bluesky-social/atproto.git` - `cd atproto` diff --git a/docs/internationalization.md b/docs/localization.md similarity index 93% rename from docs/internationalization.md rename to docs/localization.md index 3c1af7a4dc..b3dce7b418 100644 --- a/docs/internationalization.md +++ b/docs/localization.md @@ -110,4 +110,10 @@ export function Welcome() { return
{welcome}
; } -``` \ No newline at end of file +``` + + +### 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. \ No newline at end of file diff --git a/jest/test-pds.ts b/jest/test-pds.ts index 25faddfa7b..d86ebd787a 100644 --- a/jest/test-pds.ts +++ b/jest/test-pds.ts @@ -78,7 +78,7 @@ export async function createServer( }) const pic = fs.readFileSync( - path.join(__dirname, '..', 'assets', 'default-avatar.jpg'), + path.join(__dirname, '..', 'assets', 'default-avatar.png'), ) return { diff --git a/package.json b/package.json index 758b7fbea0..bed17e9dc2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bsky.app", - "version": "1.59.0", + "version": "1.60.0", "private": true, "scripts": { "prepare": "is-ci || husky install", @@ -35,7 +35,7 @@ "intl:compile": "lingui compile" }, "dependencies": { - "@atproto/api": "^0.7.3", + "@atproto/api": "^0.7.4", "@bam.tech/react-native-image-resizer": "^3.0.4", "@braintree/sanitize-url": "^6.0.2", "@emoji-mart/react": "^1.1.1", @@ -54,6 +54,7 @@ "@react-native-clipboard/clipboard": "^1.10.0", "@react-native-community/blur": "^4.3.0", "@react-native-community/datetimepicker": "7.2.0", + "@react-native-masked-view/masked-view": "^0.3.1", "@react-native-menu/menu": "^0.8.0", "@react-native-picker/picker": "2.4.10", "@react-navigation/bottom-tabs": "^6.5.7", diff --git a/src/App.native.tsx b/src/App.native.tsx index d11d05e705..6402b4a898 100644 --- a/src/App.native.tsx +++ b/src/App.native.tsx @@ -6,6 +6,10 @@ import {RootSiblingParent} from 'react-native-root-siblings' import * as SplashScreen from 'expo-splash-screen' import {GestureHandlerRootView} from 'react-native-gesture-handler' import {QueryClientProvider} from '@tanstack/react-query' +import { + SafeAreaProvider, + initialWindowMetrics, +} from 'react-native-safe-area-context' import 'view/icons' @@ -34,6 +38,7 @@ import { } from 'state/session' import {Provider as UnreadNotifsProvider} from 'state/queries/notifications/unread' import * as persisted from '#/state/persisted' +import {Splash} from '#/Splash' SplashScreen.preventAutoHideAsync() @@ -53,27 +58,28 @@ function InnerApp() { resumeSession(account) }, [resumeSession]) - // wait for session to resume - if (isInitialLoad) return null - return ( - - - - - {/* All components should be within this provider */} - - - - - - - - - - + + + + + + + {/* All components should be within this provider */} + + + + + + + + + + + + ) } diff --git a/src/Navigation.tsx b/src/Navigation.tsx index 3f6b5ba20c..c9f9272194 100644 --- a/src/Navigation.tsx +++ b/src/Navigation.tsx @@ -1,6 +1,5 @@ import * as React from 'react' import {StyleSheet} from 'react-native' -import * as SplashScreen from 'expo-splash-screen' import { NavigationContainer, createNavigationContainerRef, @@ -182,7 +181,7 @@ function commonScreens(Stack: typeof HomeTab, unreadCountLabel?: string) { ProfileFeedScreen} - options={{title: title('Feed')}} + options={{title: title('Feed'), requireAuth: true}} /> - HomeScreen} /> + HomeScreen} + options={{requireAuth: true}} + /> {commonScreens(HomeTab)} ) @@ -327,7 +330,11 @@ function FeedsTabNavigator() { animationDuration: 250, contentStyle, }}> - FeedsScreen} /> + FeedsScreen} + options={{requireAuth: true}} + /> {commonScreens(FeedsTab as typeof HomeTab)} ) @@ -399,7 +406,7 @@ const FlatNavigator = () => { HomeScreen} - options={{title: title('Home')}} + options={{title: title('Home'), requireAuth: true}} /> { FeedsScreen} - options={{title: title('Feeds')}} + options={{title: title('Feeds'), requireAuth: true}} /> ) { linking={LINKING} theme={theme} onReady={() => { - SplashScreen.hideAsync() logModuleInitTime() onReady() }}> diff --git a/src/Splash.tsx b/src/Splash.tsx new file mode 100644 index 0000000000..ead8e0f006 --- /dev/null +++ b/src/Splash.tsx @@ -0,0 +1,164 @@ +import React, {useCallback, useEffect} from 'react' +import {View, StyleSheet, Image as RNImage} from 'react-native' +import * as SplashScreen from 'expo-splash-screen' +import {Image} from 'expo-image' +import Animated, { + interpolate, + runOnJS, + useAnimatedStyle, + useSharedValue, + withTiming, + Easing, +} from 'react-native-reanimated' +import MaskedView from '@react-native-masked-view/masked-view' +import {useSafeAreaInsets} from 'react-native-safe-area-context' +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) { + const width = 1000 + const height = width * (67 / 64) + return ( + + + + ) +}) + +type Props = { + isReady: boolean +} + +SplashScreen.preventAutoHideAsync().catch(() => {}) + +const AnimatedLogo = Animated.createAnimatedComponent(Logo) + +export function Splash(props: React.PropsWithChildren) { + const insets = useSafeAreaInsets() + const intro = useSharedValue(0) + const outroLogo = useSharedValue(0) + const outroApp = useSharedValue(0) + const [isAnimationComplete, setIsAnimationComplete] = React.useState(false) + const [isImageLoaded, setIsImageLoaded] = React.useState(false) + const isReady = props.isReady && isImageLoaded + + const logoAnimations = useAnimatedStyle(() => { + return { + transform: [ + { + scale: interpolate(intro.value, [0, 1], [0.8, 1], 'clamp'), + }, + { + scale: interpolate( + outroLogo.value, + [0, 0.06, 0.08, 1], + [1, 0.8, 0.8, 400], + 'clamp', + ), + }, + ], + opacity: interpolate(intro.value, [0, 1], [0, 1], 'clamp'), + } + }) + + const appAnimation = useAnimatedStyle(() => { + return { + transform: [ + { + scale: interpolate(outroApp.value, [0, 1], [1.1, 1], 'clamp'), + }, + ], + opacity: interpolate(outroApp.value, [0, 0.9, 1], [0, 1, 1], 'clamp'), + } + }) + + const onFinish = useCallback(() => setIsAnimationComplete(true), []) + + useEffect(() => { + if (isReady) { + // hide on mount + SplashScreen.hideAsync().catch(() => {}) + + intro.value = withTiming( + 1, + {duration: 200, easing: Easing.out(Easing.cubic)}, + async () => { + // set these values to check animation at specific point + // outroLogo.value = 0.1 + // outroApp.value = 0.1 + outroLogo.value = withTiming( + 1, + {duration: 1000, easing: Easing.in(Easing.cubic)}, + () => { + runOnJS(onFinish)() + }, + ) + outroApp.value = withTiming( + 1, + {duration: 1000, easing: Easing.inOut(Easing.cubic)}, + () => { + runOnJS(onFinish)() + }, + ) + }, + ) + } + }, [onFinish, intro, outroLogo, outroApp, isReady]) + + const onLoadEnd = useCallback(() => { + setIsImageLoaded(true) + }, [setIsImageLoaded]) + + return ( + + {!isAnimationComplete && ( + + )} + + + + + }> + {!isAnimationComplete && ( + + )} + + + {props.children} + + + + ) +} diff --git a/src/lib/ScrollContext.tsx b/src/lib/ScrollContext.tsx new file mode 100644 index 0000000000..00b197bedc --- /dev/null +++ b/src/lib/ScrollContext.tsx @@ -0,0 +1,35 @@ +import React, {createContext, useContext, useMemo} from 'react' +import {ScrollHandlers} from 'react-native-reanimated' + +const ScrollContext = createContext>({ + onBeginDrag: undefined, + onEndDrag: undefined, + onScroll: undefined, +}) + +export function useScrollHandlers(): ScrollHandlers { + return useContext(ScrollContext) +} + +type ProviderProps = {children: React.ReactNode} & ScrollHandlers + +// Note: this completely *overrides* the parent handlers. +// It's up to you to compose them with the parent ones via useScrollHandlers() if needed. +export function ScrollProvider({ + children, + onBeginDrag, + onEndDrag, + onScroll, +}: ProviderProps) { + const handlers = useMemo( + () => ({ + onBeginDrag, + onEndDrag, + onScroll, + }), + [onBeginDrag, onEndDrag, onScroll], + ) + return ( + {children} + ) +} diff --git a/src/lib/api/index.ts b/src/lib/api/index.ts index d94ee4643b..440dfa5ee3 100644 --- a/src/lib/api/index.ts +++ b/src/lib/api/index.ts @@ -104,12 +104,18 @@ export async function post(agent: BskyAgent, opts: PostOpts) { // add image embed if present if (opts.images?.length) { + logger.info(`Uploading images`, { + count: opts.images.length, + }) + const images: AppBskyEmbedImages.Image[] = [] for (const image of opts.images) { opts.onStateChange?.(`Uploading image #${images.length + 1}...`) + logger.info(`Compressing image`) await image.compress() const path = image.compressed?.path ?? image.path const {width, height} = image.compressed || image + logger.info(`Uploading image`) const res = await uploadBlob(agent, path, 'image/jpeg') images.push({ image: res.data.blob, diff --git a/src/lib/assets.native.ts b/src/lib/assets.native.ts index d7ef9a05eb..754bc9d2b0 100644 --- a/src/lib/assets.native.ts +++ b/src/lib/assets.native.ts @@ -1,5 +1,4 @@ import {ImageRequireSource} from 'react-native' -export const DEF_AVATAR: ImageRequireSource = require('../../assets/default-avatar.jpg') -export const TABS_EXPLAINER: ImageRequireSource = require('../../assets/tabs-explainer.jpg') -export const CLOUD_SPLASH: ImageRequireSource = require('../../assets/cloud-splash.png') +export const DEF_AVATAR: ImageRequireSource = require('../../assets/default-avatar.png') +export const CLOUD_SPLASH: ImageRequireSource = require('../../assets/splash.png') diff --git a/src/lib/assets.ts b/src/lib/assets.ts index 216478762d..8859607d56 100644 --- a/src/lib/assets.ts +++ b/src/lib/assets.ts @@ -1,10 +1,6 @@ import {ImageRequireSource} from 'react-native' // @ts-ignore we need to pretend -prf -export const DEF_AVATAR: ImageRequireSource = {uri: '/img/default-avatar.jpg'} +export const DEF_AVATAR: ImageRequireSource = {uri: '/img/default-avatar.png'} // @ts-ignore we need to pretend -prf -export const TABS_EXPLAINER: ImageRequireSource = { - uri: '/img/tabs-explainer.jpg', -} -// @ts-ignore we need to pretend -prf -export const CLOUD_SPLASH: ImageRequireSource = {uri: '/img/cloud-splash.png'} +export const CLOUD_SPLASH: ImageRequireSource = {uri: '/img/splash.png'} diff --git a/src/lib/build-flags.ts b/src/lib/build-flags.ts index faefdd6ab7..cf05114e02 100644 --- a/src/lib/build-flags.ts +++ b/src/lib/build-flags.ts @@ -1,2 +1,2 @@ export const LOGIN_INCLUDE_DEV_SERVERS = true -export const PWI_ENABLED = false +export const PWI_ENABLED = true diff --git a/src/locale/locales/en/messages.po b/src/locale/locales/en/messages.po index 6cb186fe50..7b0c651680 100644 --- a/src/locale/locales/en/messages.po +++ b/src/locale/locales/en/messages.po @@ -47,7 +47,7 @@ msgstr "" msgid "{invitesAvailable} invite codes available" msgstr "" -#: src/view/screens/Search/Search.tsx:87 +#: src/view/screens/Search/Search.tsx:88 msgid "{message}" msgstr "" @@ -95,7 +95,7 @@ msgstr "" #: src/view/com/modals/ListAddRemoveUsers.tsx:264 #: src/view/com/modals/UserAddRemoveLists.tsx:193 -#: src/view/screens/ProfileList.tsx:783 +#: src/view/screens/ProfileList.tsx:754 msgid "Add" msgstr "" @@ -103,7 +103,7 @@ msgstr "" msgid "Add a content warning" msgstr "" -#: src/view/screens/ProfileList.tsx:773 +#: src/view/screens/ProfileList.tsx:744 msgid "Add a user to this list" msgstr "" @@ -126,11 +126,11 @@ msgstr "" msgid "Add details to report" msgstr "" -#: src/view/com/composer/Composer.tsx:432 +#: src/view/com/composer/Composer.tsx:438 msgid "Add link card" msgstr "" -#: src/view/com/composer/Composer.tsx:435 +#: src/view/com/composer/Composer.tsx:441 msgid "Add link card:" msgstr "" @@ -142,7 +142,7 @@ msgstr "" msgid "Add to Lists" msgstr "" -#: src/view/screens/ProfileFeed.tsx:280 +#: src/view/screens/ProfileFeed.tsx:270 msgid "Add to my feeds" msgstr "" @@ -224,11 +224,11 @@ msgstr "" msgid "Are you sure you want to delete the app password \"{name}\"?" 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?" msgstr "" -#: src/view/screens/ProfileList.tsx:375 +#: src/view/screens/ProfileList.tsx:352 msgid "Are you sure?" msgstr "" @@ -250,9 +250,9 @@ msgstr "" #: src/view/com/auth/login/LoginForm.tsx:249 #: src/view/com/auth/login/SetNewPasswordForm.tsx:148 #: src/view/com/modals/report/InputIssueDetails.tsx:45 -#: src/view/com/post-thread/PostThread.tsx:392 -#: src/view/com/post-thread/PostThread.tsx:442 -#: src/view/com/post-thread/PostThread.tsx:450 +#: src/view/com/post-thread/PostThread.tsx:395 +#: src/view/com/post-thread/PostThread.tsx:445 +#: src/view/com/post-thread/PostThread.tsx:453 #: src/view/com/profile/ProfileHeader.tsx:672 msgid "Back" msgstr "" @@ -275,15 +275,15 @@ msgstr "" msgid "Block Account" msgstr "" -#: src/view/screens/ProfileList.tsx:545 +#: src/view/screens/ProfileList.tsx:522 msgid "Block accounts" msgstr "" -#: src/view/screens/ProfileList.tsx:495 +#: src/view/screens/ProfileList.tsx:472 msgid "Block list" msgstr "" -#: src/view/screens/ProfileList.tsx:330 +#: src/view/screens/ProfileList.tsx:307 msgid "Block these accounts?" msgstr "" @@ -303,15 +303,19 @@ msgstr "" msgid "Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you. You will not see their content and they will be prevented from seeing yours." msgstr "" -#: src/view/com/post-thread/PostThread.tsx:248 +#: src/view/com/post-thread/PostThread.tsx:251 msgid "Blocked post." msgstr "" -#: src/view/screens/ProfileList.tsx:332 +#: src/view/screens/ProfileList.tsx:309 msgid "Blocking is public. Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you." msgstr "" -#: src/view/com/auth/SplashScreen.tsx:26 +#: src/view/com/auth/HomeLoggedOutCTA.tsx:93 +msgid "Blog" +msgstr "" + +#: src/view/com/auth/HomeLoggedOutCTA.tsx:31 msgid "Bluesky" msgstr "" @@ -343,6 +347,10 @@ msgstr "" msgid "Build version {0} {1}" msgstr "" +#: src/view/com/auth/HomeLoggedOutCTA.tsx:87 +msgid "Business" +msgstr "" + #: src/view/com/composer/photos/OpenCameraBtn.tsx:60 #: src/view/com/util/UserAvatar.tsx:221 #: src/view/com/util/UserBanner.tsx:38 @@ -353,8 +361,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." msgstr "" -#: src/view/com/composer/Composer.tsx:279 -#: src/view/com/composer/Composer.tsx:282 +#: src/view/com/composer/Composer.tsx:285 +#: src/view/com/composer/Composer.tsx:288 #: src/view/com/modals/AltImage.tsx:127 #: src/view/com/modals/ChangeEmail.tsx:218 #: src/view/com/modals/ChangeEmail.tsx:220 @@ -368,7 +376,7 @@ msgstr "" #: src/view/com/modals/LinkWarning.tsx:85 #: src/view/com/modals/Repost.tsx:73 #: src/view/com/modals/Waitlist.tsx:136 -#: src/view/screens/Search/Search.tsx:558 +#: src/view/screens/Search/Search.tsx:592 #: src/view/shell/desktop/Search.tsx:182 msgid "Cancel" msgstr "" @@ -473,7 +481,7 @@ msgid "Clear all storage data (restart after this)" msgstr "" #: src/view/com/util/forms/SearchInput.tsx:73 -#: src/view/screens/Search/Search.tsx:543 +#: src/view/screens/Search/Search.tsx:577 msgid "Clear search query" msgstr "" @@ -551,7 +559,7 @@ msgstr "" msgid "Content Languages" msgstr "" -#: src/view/com/util/moderation/ScreenHider.tsx:69 +#: src/view/com/util/moderation/ScreenHider.tsx:78 msgid "Content Warning" msgstr "" @@ -573,7 +581,7 @@ msgstr "" msgid "Copy" msgstr "" -#: src/view/screens/ProfileList.tsx:407 +#: src/view/screens/ProfileList.tsx:384 msgid "Copy link to list" msgstr "" @@ -593,15 +601,16 @@ msgstr "" msgid "Copyright Policy" msgstr "" -#: src/view/screens/ProfileFeed.tsx:103 +#: src/view/screens/ProfileFeed.tsx:94 msgid "Could not load feed" msgstr "" -#: src/view/screens/ProfileList.tsx:860 +#: src/view/screens/ProfileList.tsx:830 msgid "Could not load list" msgstr "" -#: src/view/com/auth/SplashScreen.tsx:41 +#: src/view/com/auth/HomeLoggedOutCTA.tsx:62 +#: src/view/com/auth/SplashScreen.tsx:46 msgid "Create a new account" msgstr "" @@ -609,7 +618,8 @@ msgstr "" msgid "Create Account" msgstr "" -#: src/view/com/auth/SplashScreen.tsx:38 +#: src/view/com/auth/HomeLoggedOutCTA.tsx:54 +#: src/view/com/auth/SplashScreen.tsx:43 msgid "Create new account" msgstr "" @@ -643,8 +653,8 @@ msgstr "" msgid "Delete app password" msgstr "" -#: src/view/screens/ProfileList.tsx:374 -#: src/view/screens/ProfileList.tsx:434 +#: src/view/screens/ProfileList.tsx:351 +#: src/view/screens/ProfileList.tsx:411 msgid "Delete List" msgstr "" @@ -664,7 +674,7 @@ msgstr "" msgid "Delete this post?" msgstr "" -#: src/view/com/post-thread/PostThread.tsx:240 +#: src/view/com/post-thread/PostThread.tsx:243 msgid "Deleted post." msgstr "" @@ -683,11 +693,11 @@ msgstr "" msgid "Developer Tools" msgstr "" -#: src/view/com/composer/Composer.tsx:142 +#: src/view/com/composer/Composer.tsx:143 msgid "Discard" msgstr "" -#: src/view/com/composer/Composer.tsx:136 +#: src/view/com/composer/Composer.tsx:137 msgid "Discard draft" msgstr "" @@ -739,7 +749,7 @@ msgstr "" msgid "Edit image" msgstr "" -#: src/view/screens/ProfileList.tsx:422 +#: src/view/screens/ProfileList.tsx:399 msgid "Edit list details" msgstr "" @@ -787,7 +797,7 @@ msgstr "" msgid "Enable this setting to only see replies between people you follow." msgstr "" -#: src/view/screens/Profile.tsx:471 +#: src/view/screens/Profile.tsx:425 msgid "End of feed" msgstr "" @@ -815,7 +825,7 @@ msgstr "" msgid "Enter your username and password" msgstr "" -#: src/view/screens/Search/Search.tsx:105 +#: src/view/screens/Search/Search.tsx:106 msgid "Error:" msgstr "" @@ -836,7 +846,7 @@ msgstr "" msgid "Feed offline" msgstr "" -#: src/view/com/feeds/FeedPage.tsx:140 +#: src/view/com/feeds/FeedPage.tsx:143 msgid "Feed Preferences" msgstr "" @@ -847,8 +857,8 @@ msgstr "" #: src/view/screens/Feeds.tsx:475 #: src/view/screens/Profile.tsx:164 -#: src/view/shell/bottom-bar/BottomBar.tsx:160 -#: src/view/shell/desktop/LeftNav.tsx:333 +#: src/view/shell/bottom-bar/BottomBar.tsx:181 +#: src/view/shell/desktop/LeftNav.tsx:339 #: src/view/shell/Drawer.tsx:455 #: src/view/shell/Drawer.tsx:456 msgid "Feeds" @@ -862,6 +872,14 @@ msgstr "" msgid "Feeds are custom algorithms that users build with a little coding expertise. <0/> for more information." msgstr "" +#: src/view/screens/Search/Search.tsx:422 +msgid "Find users on Bluesky" +msgstr "" + +#: src/view/screens/Search/Search.tsx:420 +msgid "Find users with the search tool on the right" +msgstr "" + #: src/view/com/auth/onboarding/RecommendedFollowsItem.tsx:150 msgid "Finding similar accounts..." msgstr "" @@ -940,17 +958,17 @@ msgstr "" msgid "Get Started" msgstr "" -#: src/view/com/auth/LoggedOut.tsx:68 -#: src/view/com/auth/LoggedOut.tsx:69 -#: src/view/com/util/moderation/ScreenHider.tsx:105 +#: src/view/com/auth/LoggedOut.tsx:70 +#: src/view/com/auth/LoggedOut.tsx:71 +#: src/view/com/util/moderation/ScreenHider.tsx:123 #: src/view/shell/desktop/LeftNav.tsx:103 msgid "Go back" msgstr "" -#: src/view/screens/ProfileFeed.tsx:112 -#: src/view/screens/ProfileFeed.tsx:117 -#: src/view/screens/ProfileList.tsx:869 -#: src/view/screens/ProfileList.tsx:874 +#: src/view/screens/ProfileFeed.tsx:103 +#: src/view/screens/ProfileFeed.tsx:108 +#: src/view/screens/ProfileList.tsx:839 +#: src/view/screens/ProfileList.tsx:844 msgid "Go Back" msgstr "" @@ -974,6 +992,7 @@ msgid "Here is your app password." msgstr "" #: src/view/com/notifications/FeedItem.tsx:316 +#: src/view/com/util/moderation/ContentHider.tsx:103 msgid "Hide" msgstr "" @@ -1009,14 +1028,14 @@ msgstr "" #~ msgid "Hmmm, we're having trouble finding this feed. It may have been deleted." #~ msgstr "" -#: src/view/shell/bottom-bar/BottomBar.tsx:116 -#: src/view/shell/desktop/LeftNav.tsx:297 +#: src/view/shell/bottom-bar/BottomBar.tsx:137 +#: src/view/shell/desktop/LeftNav.tsx:303 #: src/view/shell/Drawer.tsx:379 #: src/view/shell/Drawer.tsx:380 msgid "Home" msgstr "" -#: src/view/com/pager/FeedsTabBarMobile.tsx:99 +#: src/view/com/pager/FeedsTabBarMobile.tsx:96 #: src/view/screens/PreferencesHomeFeed.tsx:95 #: src/view/screens/Settings.tsx:481 msgid "Home Feed Preferences" @@ -1082,6 +1101,10 @@ msgstr "" msgid "Invite codes: {invitesAvailable} available" msgstr "" +#: src/view/com/auth/HomeLoggedOutCTA.tsx:99 +msgid "Jobs" +msgstr "" + #: src/view/com/modals/Waitlist.tsx:67 msgid "Join the waitlist" msgstr "" @@ -1107,9 +1130,13 @@ msgstr "" msgid "Languages" msgstr "" +#: src/view/com/util/moderation/ContentHider.tsx:101 +msgid "Learn more" +msgstr "" + #: src/view/com/util/moderation/PostAlerts.tsx:47 #: src/view/com/util/moderation/ProfileHeaderAlerts.tsx:65 -#: src/view/com/util/moderation/ScreenHider.tsx:88 +#: src/view/com/util/moderation/ScreenHider.tsx:104 msgid "Learn More" msgstr "" @@ -1117,7 +1144,7 @@ msgstr "" #: src/view/com/util/moderation/PostAlerts.tsx:40 #: src/view/com/util/moderation/PostHider.tsx:76 #: src/view/com/util/moderation/ProfileHeaderAlerts.tsx:49 -#: src/view/com/util/moderation/ScreenHider.tsx:85 +#: src/view/com/util/moderation/ScreenHider.tsx:101 msgid "Learn more about this warning" msgstr "" @@ -1147,7 +1174,7 @@ msgstr "" #~ msgid "Light" #~ msgstr "" -#: src/view/screens/ProfileFeed.tsx:643 +#: src/view/screens/ProfileFeed.tsx:577 msgid "Like this feed" msgstr "" @@ -1177,22 +1204,22 @@ msgid "List Name" msgstr "" #: src/view/screens/Profile.tsx:165 -#: src/view/shell/desktop/LeftNav.tsx:373 +#: src/view/shell/desktop/LeftNav.tsx:376 #: src/view/shell/Drawer.tsx:471 #: src/view/shell/Drawer.tsx:472 msgid "Lists" msgstr "" -#: src/view/com/post-thread/PostThread.tsx:257 -#: src/view/com/post-thread/PostThread.tsx:265 +#: src/view/com/post-thread/PostThread.tsx:260 +#: src/view/com/post-thread/PostThread.tsx:268 msgid "Load more posts" msgstr "" -#: src/view/screens/Notifications.tsx:141 +#: src/view/screens/Notifications.tsx:144 msgid "Load new notifications" msgstr "" -#: src/view/com/feeds/FeedPage.tsx:185 +#: src/view/com/feeds/FeedPage.tsx:189 msgid "Load new posts" msgstr "" @@ -1216,9 +1243,9 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/view/screens/ProfileFeed.tsx:482 -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 "" +#: 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!" +#~ msgstr "" #: src/view/com/modals/LinkWarning.tsx:63 msgid "Make sure this is where you intend to go!" @@ -1236,18 +1263,17 @@ msgstr "" msgid "Mentioned users" msgstr "" -#: src/view/screens/Search/Search.tsx:503 +#: src/view/screens/Search/Search.tsx:537 msgid "Menu" msgstr "" #: src/view/com/posts/FeedErrorMessage.tsx:194 -#: src/view/screens/ProfileFeed.tsx:490 msgid "Message from server" msgstr "" #: src/view/screens/Moderation.tsx:64 #: src/view/screens/Settings.tsx:563 -#: src/view/shell/desktop/LeftNav.tsx:391 +#: src/view/shell/desktop/LeftNav.tsx:394 #: src/view/shell/Drawer.tsx:490 #: src/view/shell/Drawer.tsx:491 msgid "Moderation" @@ -1266,8 +1292,8 @@ msgid "More feeds" msgstr "" #: src/view/com/profile/ProfileHeader.tsx:548 -#: src/view/screens/ProfileFeed.tsx:370 -#: src/view/screens/ProfileList.tsx:606 +#: src/view/screens/ProfileFeed.tsx:360 +#: src/view/screens/ProfileList.tsx:583 msgid "More options" msgstr "" @@ -1279,15 +1305,15 @@ msgstr "" msgid "Mute Account" msgstr "" -#: src/view/screens/ProfileList.tsx:533 +#: src/view/screens/ProfileList.tsx:510 msgid "Mute accounts" msgstr "" -#: src/view/screens/ProfileList.tsx:480 +#: src/view/screens/ProfileList.tsx:457 msgid "Mute list" msgstr "" -#: src/view/screens/ProfileList.tsx:293 +#: src/view/screens/ProfileList.tsx:270 msgid "Mute these accounts?" msgstr "" @@ -1307,7 +1333,7 @@ msgstr "" msgid "Muted accounts have their posts removed from your feed and from your notifications. Mutes are completely private." msgstr "" -#: src/view/screens/ProfileList.tsx:295 +#: 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." msgstr "" @@ -1345,12 +1371,12 @@ msgstr "" msgid "New" msgstr "" -#: src/view/com/feeds/FeedPage.tsx:196 +#: src/view/com/feeds/FeedPage.tsx:200 #: src/view/screens/Feeds.tsx:510 -#: src/view/screens/Profile.tsx:389 -#: src/view/screens/ProfileFeed.tsx:451 -#: src/view/screens/ProfileList.tsx:212 -#: src/view/screens/ProfileList.tsx:244 +#: src/view/screens/Profile.tsx:353 +#: src/view/screens/ProfileFeed.tsx:430 +#: src/view/screens/ProfileList.tsx:193 +#: src/view/screens/ProfileList.tsx:221 #: src/view/shell/desktop/LeftNav.tsx:246 msgid "New post" msgstr "" @@ -1379,8 +1405,8 @@ msgstr "" msgid "No" msgstr "" -#: src/view/screens/ProfileFeed.tsx:636 -#: src/view/screens/ProfileList.tsx:740 +#: src/view/screens/ProfileFeed.tsx:570 +#: src/view/screens/ProfileList.tsx:711 msgid "No description" msgstr "" @@ -1398,9 +1424,9 @@ msgstr "" #~ msgstr "" #: src/view/com/modals/ListAddRemoveUsers.tsx:127 -#: src/view/screens/Search/Search.tsx:270 -#: src/view/screens/Search/Search.tsx:298 -#: src/view/screens/Search/Search.tsx:581 +#: src/view/screens/Search/Search.tsx:271 +#: src/view/screens/Search/Search.tsx:299 +#: src/view/screens/Search/Search.tsx:615 #: src/view/shell/desktop/Search.tsx:210 msgid "No results found for {query}" msgstr "" @@ -1429,10 +1455,10 @@ msgstr "" #~ msgid "Note: Third-party apps that display Bluesky content may not respect this setting." #~ msgstr "" -#: src/view/screens/Notifications.tsx:108 -#: src/view/screens/Notifications.tsx:132 -#: src/view/shell/bottom-bar/BottomBar.tsx:187 -#: src/view/shell/desktop/LeftNav.tsx:355 +#: src/view/screens/Notifications.tsx:109 +#: src/view/screens/Notifications.tsx:133 +#: src/view/shell/bottom-bar/BottomBar.tsx:205 +#: src/view/shell/desktop/LeftNav.tsx:358 #: src/view/shell/Drawer.tsx:416 #: src/view/shell/Drawer.tsx:417 msgid "Notifications" @@ -1446,7 +1472,7 @@ msgstr "" msgid "Okay" msgstr "" -#: src/view/com/composer/Composer.tsx:348 +#: src/view/com/composer/Composer.tsx:354 msgid "One or more images is missing alt text." msgstr "" @@ -1454,7 +1480,7 @@ msgstr "" msgid "Only {0} can reply." msgstr "" -#: src/view/com/pager/FeedsTabBarMobile.tsx:79 +#: src/view/com/pager/FeedsTabBarMobile.tsx:76 msgid "Open navigation" msgstr "" @@ -1569,13 +1595,13 @@ msgstr "" msgid "Please tell us why you think this decision was incorrect." msgstr "" -#: src/view/com/composer/Composer.tsx:331 -#: src/view/com/post-thread/PostThread.tsx:223 -#: src/view/screens/PostThread.tsx:78 +#: src/view/com/composer/Composer.tsx:337 +#: src/view/com/post-thread/PostThread.tsx:226 +#: src/view/screens/PostThread.tsx:80 msgid "Post" msgstr "" -#: src/view/com/post-thread/PostThread.tsx:382 +#: src/view/com/post-thread/PostThread.tsx:385 msgid "Post hidden" msgstr "" @@ -1587,7 +1613,7 @@ msgstr "" msgid "Post Languages" msgstr "" -#: src/view/com/post-thread/PostThread.tsx:434 +#: src/view/com/post-thread/PostThread.tsx:437 msgid "Post not found" msgstr "" @@ -1623,7 +1649,8 @@ msgstr "" msgid "Processing..." 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:525 #: src/view/shell/Drawer.tsx:526 @@ -1690,7 +1717,7 @@ msgstr "" #: src/view/com/feeds/FeedSourceCard.tsx:105 #: src/view/com/feeds/FeedSourceCard.tsx:172 -#: src/view/screens/ProfileFeed.tsx:280 +#: src/view/screens/ProfileFeed.tsx:270 msgid "Remove from my feeds" msgstr "" @@ -1735,11 +1762,11 @@ msgstr "" msgid "Report Account" msgstr "" -#: src/view/screens/ProfileFeed.tsx:300 +#: src/view/screens/ProfileFeed.tsx:290 msgid "Report feed" msgstr "" -#: src/view/screens/ProfileList.tsx:448 +#: src/view/screens/ProfileList.tsx:425 msgid "Report List" msgstr "" @@ -1851,10 +1878,10 @@ msgstr "" #: src/view/com/modals/ListAddRemoveUsers.tsx:75 #: src/view/com/util/forms/SearchInput.tsx:64 -#: src/view/screens/Search/Search.tsx:381 -#: src/view/screens/Search/Search.tsx:533 -#: src/view/shell/bottom-bar/BottomBar.tsx:138 -#: src/view/shell/desktop/LeftNav.tsx:315 +#: src/view/screens/Search/Search.tsx:401 +#: src/view/screens/Search/Search.tsx:567 +#: src/view/shell/bottom-bar/BottomBar.tsx:159 +#: src/view/shell/desktop/LeftNav.tsx:321 #: src/view/shell/desktop/Search.tsx:161 #: src/view/shell/desktop/Search.tsx:170 #: src/view/shell/Drawer.tsx:343 @@ -1863,14 +1890,14 @@ msgid "Search" msgstr "" #: src/view/screens/Search/Search.tsx:390 -msgid "Search for posts and users." -msgstr "" +#~ msgid "Search for posts and users." +#~ msgstr "" #: src/view/com/modals/ChangeEmail.tsx:110 msgid "Security Step Required" msgstr "" -#: src/view/com/auth/SplashScreen.tsx:29 +#: src/view/com/auth/HomeLoggedOutCTA.tsx:39 msgid "See what's next" msgstr "" @@ -1944,7 +1971,7 @@ msgid "Set this setting to \"Yes\" to show samples of your saved feeds in your f msgstr "" #: src/view/screens/Settings.tsx:277 -#: src/view/shell/desktop/LeftNav.tsx:427 +#: src/view/shell/desktop/LeftNav.tsx:430 #: src/view/shell/Drawer.tsx:546 #: src/view/shell/Drawer.tsx:547 msgid "Settings" @@ -1956,11 +1983,11 @@ msgstr "" #: src/view/com/profile/ProfileHeader.tsx:338 #: src/view/com/util/forms/PostDropdownBtn.tsx:129 -#: src/view/screens/ProfileList.tsx:407 +#: src/view/screens/ProfileList.tsx:384 msgid "Share" msgstr "" -#: src/view/screens/ProfileFeed.tsx:312 +#: src/view/screens/ProfileFeed.tsx:302 msgid "Share feed" msgstr "" @@ -1968,11 +1995,12 @@ msgstr "" #~ msgid "Share link" #~ msgstr "" +#: src/view/com/util/moderation/ContentHider.tsx:105 #: src/view/screens/Settings.tsx:316 msgid "Show" msgstr "" -#: src/view/com/util/moderation/ScreenHider.tsx:114 +#: src/view/com/util/moderation/ScreenHider.tsx:132 msgid "Show anyway" msgstr "" @@ -2000,15 +2028,23 @@ msgstr "" msgid "Show users" msgstr "" +#: src/view/com/auth/HomeLoggedOutCTA.tsx:70 #: src/view/com/auth/login/Login.tsx:98 -#: src/view/com/auth/SplashScreen.tsx:49 -#: src/view/shell/NavSignupCard.tsx:52 -#: src/view/shell/NavSignupCard.tsx:53 +#: 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:59 msgid "Sign in" msgstr "" -#: src/view/com/auth/SplashScreen.tsx:52 -#: src/view/com/auth/SplashScreen.web.tsx:84 +#: src/view/com/auth/HomeLoggedOutCTA.tsx:78 +#: src/view/com/auth/SplashScreen.tsx:57 +#: src/view/com/auth/SplashScreen.web.tsx:87 msgid "Sign In" msgstr "" @@ -2030,16 +2066,26 @@ msgstr "" msgid "Sign out" msgstr "" -#: src/view/shell/NavSignupCard.tsx:43 -#: src/view/shell/NavSignupCard.tsx:44 -#: src/view/shell/NavSignupCard.tsx:46 +#: 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:50 +#: src/view/shell/NavSignupCard.tsx:52 msgid "Sign up" msgstr "" -#: src/view/shell/NavSignupCard.tsx:36 +#: src/view/shell/NavSignupCard.tsx:42 msgid "Sign up or sign in to join the conversation" msgstr "" +#: src/view/com/util/moderation/ScreenHider.tsx:76 +msgid "Sign-in Required" +msgstr "" + #: src/view/screens/Settings.tsx:327 msgid "Signed in as" msgstr "" @@ -2077,15 +2123,15 @@ msgstr "" msgid "Submit" msgstr "Submit" -#: src/view/screens/ProfileList.tsx:597 +#: src/view/screens/ProfileList.tsx:574 msgid "Subscribe" msgstr "" -#: src/view/screens/ProfileList.tsx:593 +#: src/view/screens/ProfileList.tsx:570 msgid "Subscribe to this list" msgstr "" -#: src/view/screens/Search/Search.tsx:354 +#: src/view/screens/Search/Search.tsx:357 msgid "Suggested Follows" msgstr "" @@ -2135,7 +2181,7 @@ msgstr "" msgid "The Copyright Policy has been moved to <0/>" msgstr "" -#: src/view/com/post-thread/PostThread.tsx:437 +#: src/view/com/post-thread/PostThread.tsx:440 msgid "The post may have been deleted." msgstr "" @@ -2159,10 +2205,14 @@ msgstr "" msgid "This {0} has been labeled." msgstr "" -#: src/view/com/util/moderation/ScreenHider.tsx:72 +#: src/view/com/util/moderation/ScreenHider.tsx:88 msgid "This {screenDescription} has been flagged:" msgstr "" +#: src/view/com/util/moderation/ScreenHider.tsx:83 +msgid "This account has requested that users sign in to view their profile." +msgstr "" + #: src/view/com/posts/FeedErrorMessage.tsx:107 msgid "This content is not viewable without a Bluesky account." msgstr "" @@ -2222,11 +2272,11 @@ msgstr "" msgid "Try again" msgstr "" -#: src/view/screens/ProfileList.tsx:495 +#: src/view/screens/ProfileList.tsx:472 msgid "Un-block list" msgstr "" -#: src/view/screens/ProfileList.tsx:480 +#: src/view/screens/ProfileList.tsx:457 msgid "Un-mute list" msgstr "" @@ -2262,7 +2312,7 @@ msgstr "" msgid "Unmute thread" msgstr "" -#: src/view/screens/ProfileList.tsx:463 +#: src/view/screens/ProfileList.tsx:440 msgid "Unpin moderation list" msgstr "" @@ -2311,7 +2361,7 @@ msgstr "" msgid "Username or email address" msgstr "" -#: src/view/screens/ProfileList.tsx:767 +#: src/view/screens/ProfileList.tsx:738 msgid "Users" msgstr "" @@ -2368,7 +2418,7 @@ msgstr "" #~ msgid "We're sorry, but this feed is currently receiving high traffic and is temporarily unavailable. Please try again later." #~ msgstr "" -#: src/view/screens/Search/Search.tsx:237 +#: src/view/screens/Search/Search.tsx:238 msgid "We're sorry, but your search could not be completed. Please try again in a few minutes." msgstr "" @@ -2384,6 +2434,10 @@ msgstr "" msgid "What is the issue with this {collectionName}?" msgstr "" +#: src/view/com/auth/SplashScreen.tsx:34 +msgid "What's up?" +msgstr "" + #: src/view/com/modals/lang-settings/PostLanguagesSettings.tsx:78 msgid "Which languages are used in this post?" msgstr "" @@ -2405,7 +2459,7 @@ msgstr "" msgid "Wide" msgstr "" -#: src/view/com/composer/Composer.tsx:403 +#: src/view/com/composer/Composer.tsx:409 msgid "Write post" msgstr "" @@ -2444,16 +2498,16 @@ msgstr "" msgid "You don't have any saved feeds." msgstr "" -#: src/view/com/post-thread/PostThread.tsx:385 +#: src/view/com/post-thread/PostThread.tsx:388 msgid "You have blocked the author or you have been blocked by the author." msgstr "" -#: src/view/com/feeds/ProfileFeedgens.tsx:154 +#: src/view/com/feeds/ProfileFeedgens.tsx:141 msgid "You have no feeds." msgstr "" #: src/view/com/lists/MyLists.tsx:89 -#: src/view/com/lists/ProfileLists.tsx:158 +#: src/view/com/lists/ProfileLists.tsx:145 msgid "You have no lists." msgstr "" diff --git a/src/locale/locales/hi/messages.po b/src/locale/locales/hi/messages.po index cd7151d8d9..67eeb13b06 100644 --- a/src/locale/locales/hi/messages.po +++ b/src/locale/locales/hi/messages.po @@ -47,7 +47,7 @@ msgstr "" msgid "{invitesAvailable} invite codes available" msgstr "" -#: src/view/screens/Search/Search.tsx:87 +#: src/view/screens/Search/Search.tsx:88 msgid "{message}" msgstr "" @@ -95,7 +95,7 @@ msgstr "अकाउंट के विकल्प" #: src/view/com/modals/ListAddRemoveUsers.tsx:264 #: src/view/com/modals/UserAddRemoveLists.tsx:193 -#: src/view/screens/ProfileList.tsx:783 +#: src/view/screens/ProfileList.tsx:754 msgid "Add" msgstr "ऐड करो" @@ -103,7 +103,7 @@ msgstr "ऐड करो" msgid "Add a content warning" msgstr "सामग्री चेतावनी जोड़ें" -#: src/view/screens/ProfileList.tsx:773 +#: src/view/screens/ProfileList.tsx:744 msgid "Add a user to this list" msgstr "इस सूची में किसी को जोड़ें" @@ -126,11 +126,11 @@ msgstr "विवरण जोड़ें" msgid "Add details to report" msgstr "रिपोर्ट करने के लिए विवरण जोड़ें" -#: src/view/com/composer/Composer.tsx:432 +#: src/view/com/composer/Composer.tsx:438 msgid "Add link card" msgstr "लिंक कार्ड जोड़ें" -#: src/view/com/composer/Composer.tsx:435 +#: src/view/com/composer/Composer.tsx:441 msgid "Add link card:" msgstr "लिंक कार्ड जोड़ें:" @@ -142,7 +142,7 @@ msgstr "अपने डोमेन में निम्नलिखित DN msgid "Add to Lists" msgstr "सूचियों में जोड़ें" -#: src/view/screens/ProfileFeed.tsx:280 +#: src/view/screens/ProfileFeed.tsx:270 msgid "Add to my feeds" msgstr "इस फ़ीड को सहेजें" @@ -224,11 +224,11 @@ msgstr "दिखावट" msgid "Are you sure you want to delete the app password \"{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?" msgstr "क्या आप वाकई इस ड्राफ्ट को हटाना करना चाहेंगे?" -#: src/view/screens/ProfileList.tsx:375 +#: src/view/screens/ProfileList.tsx:352 msgid "Are you sure?" msgstr "क्या आप वास्तव में इसे करना चाहते हैं?" @@ -250,9 +250,9 @@ msgstr "कलात्मक या गैर-कामुक नग्नत #: src/view/com/auth/login/LoginForm.tsx:249 #: src/view/com/auth/login/SetNewPasswordForm.tsx:148 #: src/view/com/modals/report/InputIssueDetails.tsx:45 -#: src/view/com/post-thread/PostThread.tsx:392 -#: src/view/com/post-thread/PostThread.tsx:442 -#: src/view/com/post-thread/PostThread.tsx:450 +#: src/view/com/post-thread/PostThread.tsx:395 +#: src/view/com/post-thread/PostThread.tsx:445 +#: src/view/com/post-thread/PostThread.tsx:453 #: src/view/com/profile/ProfileHeader.tsx:672 msgid "Back" msgstr "वापस" @@ -275,15 +275,15 @@ msgstr "जन्मदिन:" msgid "Block Account" msgstr "खाता ब्लॉक करें" -#: src/view/screens/ProfileList.tsx:545 +#: src/view/screens/ProfileList.tsx:522 msgid "Block accounts" msgstr "खाता ब्लॉक करें" -#: src/view/screens/ProfileList.tsx:495 +#: src/view/screens/ProfileList.tsx:472 msgid "Block list" msgstr "" -#: src/view/screens/ProfileList.tsx:330 +#: src/view/screens/ProfileList.tsx:307 msgid "Block these accounts?" msgstr "खाता ब्लॉक करें?" @@ -303,15 +303,19 @@ msgstr "अवरुद्ध खाते आपके थ्रेड्स msgid "Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you. You will not see their content and they will be prevented from seeing yours." msgstr "अवरुद्ध खाते आपके थ्रेड्स में उत्तर नहीं दे सकते, आपका उल्लेख नहीं कर सकते, या अन्यथा आपके साथ बातचीत नहीं कर सकते। आप उनकी सामग्री नहीं देख पाएंगे और उन्हें आपकी सामग्री देखने से रोका जाएगा।" -#: src/view/com/post-thread/PostThread.tsx:248 +#: src/view/com/post-thread/PostThread.tsx:251 msgid "Blocked post." msgstr "ब्लॉक पोस्ट।" -#: src/view/screens/ProfileList.tsx:332 +#: src/view/screens/ProfileList.tsx:309 msgid "Blocking is public. Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you." msgstr "अवरोधन सार्वजनिक है. अवरुद्ध खाते आपके थ्रेड्स में उत्तर नहीं दे सकते, आपका उल्लेख नहीं कर सकते, या अन्यथा आपके साथ बातचीत नहीं कर सकते।" -#: src/view/com/auth/SplashScreen.tsx:26 +#: src/view/com/auth/HomeLoggedOutCTA.tsx:93 +msgid "Blog" +msgstr "" + +#: src/view/com/auth/HomeLoggedOutCTA.tsx:31 msgid "Bluesky" msgstr "Bluesky" @@ -343,6 +347,10 @@ msgstr "Bluesky.Social" msgid "Build version {0} {1}" msgstr "Build version {0} {1}" +#: src/view/com/auth/HomeLoggedOutCTA.tsx:87 +msgid "Business" +msgstr "" + #: src/view/com/composer/photos/OpenCameraBtn.tsx:60 #: src/view/com/util/UserAvatar.tsx:221 #: src/view/com/util/UserBanner.tsx:38 @@ -353,8 +361,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." msgstr "केवल अक्षर, संख्या, रिक्त स्थान, डैश और अंडरस्कोर हो सकते हैं। कम से कम 4 अक्षर लंबा होना चाहिए, लेकिन 32 अक्षरों से अधिक लंबा नहीं होना चाहिए।।" -#: src/view/com/composer/Composer.tsx:279 -#: src/view/com/composer/Composer.tsx:282 +#: src/view/com/composer/Composer.tsx:285 +#: src/view/com/composer/Composer.tsx:288 #: src/view/com/modals/AltImage.tsx:127 #: src/view/com/modals/ChangeEmail.tsx:218 #: src/view/com/modals/ChangeEmail.tsx:220 @@ -368,7 +376,7 @@ msgstr "केवल अक्षर, संख्या, रिक्त स् #: src/view/com/modals/LinkWarning.tsx:85 #: src/view/com/modals/Repost.tsx:73 #: src/view/com/modals/Waitlist.tsx:136 -#: src/view/screens/Search/Search.tsx:558 +#: src/view/screens/Search/Search.tsx:592 #: src/view/shell/desktop/Search.tsx:182 msgid "Cancel" msgstr "कैंसिल" @@ -469,7 +477,7 @@ msgid "Clear all storage data (restart after this)" msgstr "" #: src/view/com/util/forms/SearchInput.tsx:73 -#: src/view/screens/Search/Search.tsx:543 +#: src/view/screens/Search/Search.tsx:577 msgid "Clear search query" msgstr "खोज क्वेरी साफ़ करें" @@ -547,7 +555,7 @@ msgstr "सामग्री फ़िल्टरिंग" msgid "Content Languages" msgstr "सामग्री भाषा" -#: src/view/com/util/moderation/ScreenHider.tsx:69 +#: src/view/com/util/moderation/ScreenHider.tsx:78 msgid "Content Warning" msgstr "सामग्री चेतावनी" @@ -569,7 +577,7 @@ msgstr "कॉपी कर ली" msgid "Copy" msgstr "कॉपी" -#: src/view/screens/ProfileList.tsx:407 +#: src/view/screens/ProfileList.tsx:384 msgid "Copy link to list" msgstr "" @@ -589,15 +597,16 @@ msgstr "पोस्ट टेक्स्ट कॉपी करें" msgid "Copyright Policy" msgstr "कॉपीराइट नीति" -#: src/view/screens/ProfileFeed.tsx:103 +#: src/view/screens/ProfileFeed.tsx:94 msgid "Could not load feed" msgstr "फ़ीड लोड नहीं कर सकता" -#: src/view/screens/ProfileList.tsx:860 +#: src/view/screens/ProfileList.tsx:830 msgid "Could not load list" msgstr "सूची लोड नहीं कर सकता" -#: src/view/com/auth/SplashScreen.tsx:41 +#: src/view/com/auth/HomeLoggedOutCTA.tsx:62 +#: src/view/com/auth/SplashScreen.tsx:46 msgid "Create a new account" msgstr "नया खाता बनाएं" @@ -605,7 +614,8 @@ msgstr "नया खाता बनाएं" msgid "Create Account" msgstr "खाता बनाएँ" -#: src/view/com/auth/SplashScreen.tsx:38 +#: src/view/com/auth/HomeLoggedOutCTA.tsx:54 +#: src/view/com/auth/SplashScreen.tsx:43 msgid "Create new account" msgstr "नया खाता बनाएं" @@ -639,8 +649,8 @@ msgstr "खाता हटाएं" msgid "Delete app password" msgstr "अप्प पासवर्ड हटाएं" -#: src/view/screens/ProfileList.tsx:374 -#: src/view/screens/ProfileList.tsx:434 +#: src/view/screens/ProfileList.tsx:351 +#: src/view/screens/ProfileList.tsx:411 msgid "Delete List" msgstr "सूची हटाएँ" @@ -660,7 +670,7 @@ msgstr "पोस्ट को हटाएं" msgid "Delete this post?" msgstr "इस पोस्ट को डीलीट करें?" -#: src/view/com/post-thread/PostThread.tsx:240 +#: src/view/com/post-thread/PostThread.tsx:243 msgid "Deleted post." msgstr "यह पोस्ट मिटाई जा चुकी है" @@ -679,11 +689,11 @@ msgstr "देव सर्वर" msgid "Developer Tools" msgstr "डेवलपर उपकरण" -#: src/view/com/composer/Composer.tsx:142 +#: src/view/com/composer/Composer.tsx:143 msgid "Discard" msgstr "" -#: src/view/com/composer/Composer.tsx:136 +#: src/view/com/composer/Composer.tsx:137 msgid "Discard draft" msgstr "ड्राफ्ट हटाएं" @@ -735,7 +745,7 @@ msgstr "प्रत्येक कोड एक बार काम करत msgid "Edit image" msgstr "छवि संपादित करें" -#: src/view/screens/ProfileList.tsx:422 +#: src/view/screens/ProfileList.tsx:399 msgid "Edit list details" msgstr "सूची विवरण संपादित करें" @@ -783,7 +793,7 @@ msgstr "ईमेल:" msgid "Enable this setting to only see replies between people you follow." msgstr "इस सेटिंग को केवल उन लोगों के बीच जवाब देखने में सक्षम करें जिन्हें आप फॉलो करते हैं।।" -#: src/view/screens/Profile.tsx:471 +#: src/view/screens/Profile.tsx:425 msgid "End of feed" msgstr "" @@ -811,7 +821,7 @@ msgstr "नीचे अपना नया ईमेल पता दर्ज msgid "Enter your username and password" msgstr "अपने यूज़रनेम और पासवर्ड दर्ज करें" -#: src/view/screens/Search/Search.tsx:105 +#: src/view/screens/Search/Search.tsx:106 msgid "Error:" msgstr "" @@ -832,7 +842,7 @@ msgstr "अनुशंसित फ़ीड लोड करने में msgid "Feed offline" msgstr "फ़ीड ऑफ़लाइन है" -#: src/view/com/feeds/FeedPage.tsx:140 +#: src/view/com/feeds/FeedPage.tsx:143 msgid "Feed Preferences" msgstr "फ़ीड प्राथमिकता" @@ -843,8 +853,8 @@ msgstr "प्रतिक्रिया" #: src/view/screens/Feeds.tsx:475 #: src/view/screens/Profile.tsx:164 -#: src/view/shell/bottom-bar/BottomBar.tsx:160 -#: src/view/shell/desktop/LeftNav.tsx:333 +#: src/view/shell/bottom-bar/BottomBar.tsx:181 +#: src/view/shell/desktop/LeftNav.tsx:339 #: src/view/shell/Drawer.tsx:455 #: src/view/shell/Drawer.tsx:456 msgid "Feeds" @@ -858,6 +868,14 @@ msgstr "सामग्री को व्यवस्थित करने msgid "Feeds are custom algorithms that users build with a little coding expertise. <0/> for more information." msgstr "फ़ीड कस्टम एल्गोरिदम हैं जिन्हें उपयोगकर्ता थोड़ी कोडिंग विशेषज्ञता के साथ बनाते हैं। <0/> अधिक जानकारी के लिए." +#: src/view/screens/Search/Search.tsx:422 +msgid "Find users on Bluesky" +msgstr "" + +#: src/view/screens/Search/Search.tsx:420 +msgid "Find users with the search tool on the right" +msgstr "" + #: src/view/com/auth/onboarding/RecommendedFollowsItem.tsx:150 msgid "Finding similar accounts..." msgstr "मिलते-जुलते खाते ढूँढना" @@ -932,17 +950,17 @@ msgstr "गैलरी" msgid "Get Started" msgstr "प्रारंभ करें" -#: src/view/com/auth/LoggedOut.tsx:68 -#: src/view/com/auth/LoggedOut.tsx:69 -#: src/view/com/util/moderation/ScreenHider.tsx:105 +#: src/view/com/auth/LoggedOut.tsx:70 +#: src/view/com/auth/LoggedOut.tsx:71 +#: src/view/com/util/moderation/ScreenHider.tsx:123 #: src/view/shell/desktop/LeftNav.tsx:103 msgid "Go back" msgstr "वापस जाओ" -#: src/view/screens/ProfileFeed.tsx:112 -#: src/view/screens/ProfileFeed.tsx:117 -#: src/view/screens/ProfileList.tsx:869 -#: src/view/screens/ProfileList.tsx:874 +#: src/view/screens/ProfileFeed.tsx:103 +#: src/view/screens/ProfileFeed.tsx:108 +#: src/view/screens/ProfileList.tsx:839 +#: src/view/screens/ProfileList.tsx:844 msgid "Go Back" msgstr "वापस जाओ" @@ -966,6 +984,7 @@ msgid "Here is your app password." msgstr "यहां आपका ऐप पासवर्ड है." #: src/view/com/notifications/FeedItem.tsx:316 +#: src/view/com/util/moderation/ContentHider.tsx:103 msgid "Hide" msgstr "इसे छिपाएं" @@ -1001,14 +1020,14 @@ msgstr "" #~ msgid "Hmmm, we're having trouble finding this feed. It may have been deleted." #~ msgstr "" -#: src/view/shell/bottom-bar/BottomBar.tsx:116 -#: src/view/shell/desktop/LeftNav.tsx:297 +#: src/view/shell/bottom-bar/BottomBar.tsx:137 +#: src/view/shell/desktop/LeftNav.tsx:303 #: src/view/shell/Drawer.tsx:379 #: src/view/shell/Drawer.tsx:380 msgid "Home" msgstr "होम फीड" -#: src/view/com/pager/FeedsTabBarMobile.tsx:99 +#: src/view/com/pager/FeedsTabBarMobile.tsx:96 #: src/view/screens/PreferencesHomeFeed.tsx:95 #: src/view/screens/Settings.tsx:481 msgid "Home Feed Preferences" @@ -1074,6 +1093,10 @@ msgstr "" msgid "Invite codes: {invitesAvailable} available" msgstr "" +#: src/view/com/auth/HomeLoggedOutCTA.tsx:99 +msgid "Jobs" +msgstr "" + #: src/view/com/modals/Waitlist.tsx:67 msgid "Join the waitlist" msgstr "प्रतीक्षा सूची में शामिल हों" @@ -1099,9 +1122,13 @@ msgstr "भाषा सेटिंग्स" msgid "Languages" msgstr "भाषा" +#: src/view/com/util/moderation/ContentHider.tsx:101 +msgid "Learn more" +msgstr "" + #: src/view/com/util/moderation/PostAlerts.tsx:47 #: src/view/com/util/moderation/ProfileHeaderAlerts.tsx:65 -#: src/view/com/util/moderation/ScreenHider.tsx:88 +#: src/view/com/util/moderation/ScreenHider.tsx:104 msgid "Learn More" msgstr "अधिक जानें" @@ -1109,7 +1136,7 @@ msgstr "अधिक जानें" #: src/view/com/util/moderation/PostAlerts.tsx:40 #: src/view/com/util/moderation/PostHider.tsx:76 #: src/view/com/util/moderation/ProfileHeaderAlerts.tsx:49 -#: src/view/com/util/moderation/ScreenHider.tsx:85 +#: src/view/com/util/moderation/ScreenHider.tsx:101 msgid "Learn more about this warning" msgstr "इस चेतावनी के बारे में अधिक जानें" @@ -1139,7 +1166,7 @@ msgstr "चित्र पुस्तकालय" #~ msgid "Light" #~ msgstr "लाइट मोड" -#: src/view/screens/ProfileFeed.tsx:643 +#: src/view/screens/ProfileFeed.tsx:577 msgid "Like this feed" msgstr "इस फ़ीड को लाइक करो" @@ -1169,22 +1196,22 @@ msgid "List Name" msgstr "सूची का नाम" #: src/view/screens/Profile.tsx:165 -#: src/view/shell/desktop/LeftNav.tsx:373 +#: src/view/shell/desktop/LeftNav.tsx:376 #: src/view/shell/Drawer.tsx:471 #: src/view/shell/Drawer.tsx:472 msgid "Lists" msgstr "सूची" -#: src/view/com/post-thread/PostThread.tsx:257 -#: src/view/com/post-thread/PostThread.tsx:265 +#: src/view/com/post-thread/PostThread.tsx:260 +#: src/view/com/post-thread/PostThread.tsx:268 msgid "Load more posts" msgstr "अधिक पोस्ट लोड करें" -#: src/view/screens/Notifications.tsx:141 +#: src/view/screens/Notifications.tsx:144 msgid "Load new notifications" msgstr "नई सूचनाएं लोड करें" -#: src/view/com/feeds/FeedPage.tsx:185 +#: src/view/com/feeds/FeedPage.tsx:189 msgid "Load new posts" msgstr "नई पोस्ट लोड करें" @@ -1208,9 +1235,9 @@ msgstr "" msgid "Login to account that is not listed" msgstr "उस खाते में लॉग इन करें जो सूचीबद्ध नहीं है" -#: src/view/screens/ProfileFeed.tsx:482 -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 "" +#: 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!" +#~ msgstr "" #: src/view/com/modals/LinkWarning.tsx:63 msgid "Make sure this is where you intend to go!" @@ -1228,18 +1255,17 @@ msgstr "" msgid "Mentioned users" msgstr "" -#: src/view/screens/Search/Search.tsx:503 +#: src/view/screens/Search/Search.tsx:537 msgid "Menu" msgstr "मेनू" #: src/view/com/posts/FeedErrorMessage.tsx:194 -#: src/view/screens/ProfileFeed.tsx:490 msgid "Message from server" msgstr "" #: src/view/screens/Moderation.tsx:64 #: src/view/screens/Settings.tsx:563 -#: src/view/shell/desktop/LeftNav.tsx:391 +#: src/view/shell/desktop/LeftNav.tsx:394 #: src/view/shell/Drawer.tsx:490 #: src/view/shell/Drawer.tsx:491 msgid "Moderation" @@ -1258,8 +1284,8 @@ msgid "More feeds" msgstr "अधिक फ़ीड" #: src/view/com/profile/ProfileHeader.tsx:548 -#: src/view/screens/ProfileFeed.tsx:370 -#: src/view/screens/ProfileList.tsx:606 +#: src/view/screens/ProfileFeed.tsx:360 +#: src/view/screens/ProfileList.tsx:583 msgid "More options" msgstr "अधिक विकल्प" @@ -1271,15 +1297,15 @@ msgstr "अधिक विकल्प" msgid "Mute Account" msgstr "खाता म्यूट करें" -#: src/view/screens/ProfileList.tsx:533 +#: src/view/screens/ProfileList.tsx:510 msgid "Mute accounts" msgstr "खातों को म्यूट करें" -#: src/view/screens/ProfileList.tsx:480 +#: src/view/screens/ProfileList.tsx:457 msgid "Mute list" msgstr "" -#: src/view/screens/ProfileList.tsx:293 +#: src/view/screens/ProfileList.tsx:270 msgid "Mute these accounts?" msgstr "इन खातों को म्यूट करें?" @@ -1299,7 +1325,7 @@ msgstr "म्यूट किए गए खाते" msgid "Muted accounts have their posts removed from your feed and from your notifications. Mutes are completely private." msgstr "म्यूट किए गए खातों की पोस्ट आपके फ़ीड और आपकी सूचनाओं से हटा दी जाती हैं। म्यूट पूरी तरह से निजी हैं." -#: src/view/screens/ProfileList.tsx:295 +#: 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." msgstr "म्यूट करना निजी है. म्यूट किए गए खाते आपके साथ इंटरैक्ट कर सकते हैं, लेकिन आप उनकी पोस्ट नहीं देखेंगे या उनसे सूचनाएं प्राप्त नहीं करेंगे।" @@ -1337,12 +1363,12 @@ msgstr "अपने फ़ॉलोअर्स और डेटा तक प msgid "New" msgstr "नया" -#: src/view/com/feeds/FeedPage.tsx:196 +#: src/view/com/feeds/FeedPage.tsx:200 #: src/view/screens/Feeds.tsx:510 -#: src/view/screens/Profile.tsx:389 -#: src/view/screens/ProfileFeed.tsx:451 -#: src/view/screens/ProfileList.tsx:212 -#: src/view/screens/ProfileList.tsx:244 +#: src/view/screens/Profile.tsx:353 +#: src/view/screens/ProfileFeed.tsx:430 +#: src/view/screens/ProfileList.tsx:193 +#: src/view/screens/ProfileList.tsx:221 #: src/view/shell/desktop/LeftNav.tsx:246 msgid "New post" msgstr "नई पोस्ट" @@ -1371,8 +1397,8 @@ msgstr "अगली फोटो" msgid "No" msgstr "नहीं" -#: src/view/screens/ProfileFeed.tsx:636 -#: src/view/screens/ProfileList.tsx:740 +#: src/view/screens/ProfileFeed.tsx:570 +#: src/view/screens/ProfileList.tsx:711 msgid "No description" msgstr "कोई विवरण नहीं" @@ -1390,9 +1416,9 @@ msgstr "\"{query}\" के लिए कोई परिणाम नहीं #~ msgstr "{0} के लिए कोई परिणाम नहीं मिला" #: src/view/com/modals/ListAddRemoveUsers.tsx:127 -#: src/view/screens/Search/Search.tsx:270 -#: src/view/screens/Search/Search.tsx:298 -#: src/view/screens/Search/Search.tsx:581 +#: src/view/screens/Search/Search.tsx:271 +#: src/view/screens/Search/Search.tsx:299 +#: src/view/screens/Search/Search.tsx:615 #: src/view/shell/desktop/Search.tsx:210 msgid "No results found for {query}" msgstr "" @@ -1421,10 +1447,10 @@ msgstr "" #~ msgid "Note: Third-party apps that display Bluesky content may not respect this setting." #~ msgstr "" -#: src/view/screens/Notifications.tsx:108 -#: src/view/screens/Notifications.tsx:132 -#: src/view/shell/bottom-bar/BottomBar.tsx:187 -#: src/view/shell/desktop/LeftNav.tsx:355 +#: src/view/screens/Notifications.tsx:109 +#: src/view/screens/Notifications.tsx:133 +#: src/view/shell/bottom-bar/BottomBar.tsx:205 +#: src/view/shell/desktop/LeftNav.tsx:358 #: src/view/shell/Drawer.tsx:416 #: src/view/shell/Drawer.tsx:417 msgid "Notifications" @@ -1438,7 +1464,7 @@ msgstr "अरे नहीं!" msgid "Okay" msgstr "ठीक है" -#: src/view/com/composer/Composer.tsx:348 +#: src/view/com/composer/Composer.tsx:354 msgid "One or more images is missing alt text." msgstr "एक या अधिक छवियाँ alt पाठ याद आती हैं।।" @@ -1446,7 +1472,7 @@ msgstr "एक या अधिक छवियाँ alt पाठ याद msgid "Only {0} can reply." msgstr "" -#: src/view/com/pager/FeedsTabBarMobile.tsx:79 +#: src/view/com/pager/FeedsTabBarMobile.tsx:76 msgid "Open navigation" msgstr "ओपन नेविगेशन" @@ -1561,13 +1587,13 @@ msgstr "कृपया अपना पासवर्ड भी दर्ज msgid "Please tell us why you think this decision was incorrect." msgstr "" -#: src/view/com/composer/Composer.tsx:331 -#: src/view/com/post-thread/PostThread.tsx:223 -#: src/view/screens/PostThread.tsx:78 +#: src/view/com/composer/Composer.tsx:337 +#: src/view/com/post-thread/PostThread.tsx:226 +#: src/view/screens/PostThread.tsx:80 msgid "Post" msgstr "पोस्ट" -#: src/view/com/post-thread/PostThread.tsx:382 +#: src/view/com/post-thread/PostThread.tsx:385 msgid "Post hidden" msgstr "छुपा पोस्ट" @@ -1579,7 +1605,7 @@ msgstr "पोस्ट भाषा" msgid "Post Languages" msgstr "पोस्ट भाषा" -#: src/view/com/post-thread/PostThread.tsx:434 +#: src/view/com/post-thread/PostThread.tsx:437 msgid "Post not found" msgstr "पोस्ट नहीं मिला" @@ -1615,7 +1641,8 @@ msgstr "गोपनीयता नीति" msgid "Processing..." 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:525 #: src/view/shell/Drawer.tsx:526 @@ -1682,7 +1709,7 @@ msgstr "फ़ीड हटाएँ" #: src/view/com/feeds/FeedSourceCard.tsx:105 #: src/view/com/feeds/FeedSourceCard.tsx:172 -#: src/view/screens/ProfileFeed.tsx:280 +#: src/view/screens/ProfileFeed.tsx:270 msgid "Remove from my feeds" msgstr "मेरे फ़ीड से हटाएँ" @@ -1727,11 +1754,11 @@ msgstr "रिपोर्ट {collectionName}" msgid "Report Account" msgstr "रिपोर्ट" -#: src/view/screens/ProfileFeed.tsx:300 +#: src/view/screens/ProfileFeed.tsx:290 msgid "Report feed" msgstr "रिपोर्ट फ़ीड" -#: src/view/screens/ProfileList.tsx:448 +#: src/view/screens/ProfileList.tsx:425 msgid "Report List" msgstr "रिपोर्ट सूची" @@ -1843,10 +1870,10 @@ msgstr "सहेजे गए फ़ीड" #: src/view/com/modals/ListAddRemoveUsers.tsx:75 #: src/view/com/util/forms/SearchInput.tsx:64 -#: src/view/screens/Search/Search.tsx:381 -#: src/view/screens/Search/Search.tsx:533 -#: src/view/shell/bottom-bar/BottomBar.tsx:138 -#: src/view/shell/desktop/LeftNav.tsx:315 +#: src/view/screens/Search/Search.tsx:401 +#: src/view/screens/Search/Search.tsx:567 +#: src/view/shell/bottom-bar/BottomBar.tsx:159 +#: src/view/shell/desktop/LeftNav.tsx:321 #: src/view/shell/desktop/Search.tsx:161 #: src/view/shell/desktop/Search.tsx:170 #: src/view/shell/Drawer.tsx:343 @@ -1855,14 +1882,14 @@ msgid "Search" msgstr "खोज" #: src/view/screens/Search/Search.tsx:390 -msgid "Search for posts and users." -msgstr "" +#~ msgid "Search for posts and users." +#~ msgstr "" #: src/view/com/modals/ChangeEmail.tsx:110 msgid "Security Step Required" msgstr "सुरक्षा चरण आवश्यक" -#: src/view/com/auth/SplashScreen.tsx:29 +#: src/view/com/auth/HomeLoggedOutCTA.tsx:39 msgid "See what's next" msgstr "आगे क्या है" @@ -1936,7 +1963,7 @@ msgid "Set this setting to \"Yes\" to show samples of your saved feeds in your f msgstr "इस सेटिंग को अपने निम्नलिखित फ़ीड में अपने सहेजे गए फ़ीड के नमूने दिखाने के लिए \"हाँ\" पर सेट करें। यह एक प्रयोगात्मक विशेषता है।।" #: src/view/screens/Settings.tsx:277 -#: src/view/shell/desktop/LeftNav.tsx:427 +#: src/view/shell/desktop/LeftNav.tsx:430 #: src/view/shell/Drawer.tsx:546 #: src/view/shell/Drawer.tsx:547 msgid "Settings" @@ -1948,11 +1975,11 @@ msgstr "यौन गतिविधि या कामुक नग्नत #: src/view/com/profile/ProfileHeader.tsx:338 #: src/view/com/util/forms/PostDropdownBtn.tsx:129 -#: src/view/screens/ProfileList.tsx:407 +#: src/view/screens/ProfileList.tsx:384 msgid "Share" msgstr "शेयर" -#: src/view/screens/ProfileFeed.tsx:312 +#: src/view/screens/ProfileFeed.tsx:302 msgid "Share feed" msgstr "" @@ -1960,11 +1987,12 @@ msgstr "" #~ msgid "Share link" #~ msgstr "लिंक शेयर करें" +#: src/view/com/util/moderation/ContentHider.tsx:105 #: src/view/screens/Settings.tsx:316 msgid "Show" msgstr "दिखाओ" -#: src/view/com/util/moderation/ScreenHider.tsx:114 +#: src/view/com/util/moderation/ScreenHider.tsx:132 msgid "Show anyway" msgstr "दिखाओ" @@ -1992,15 +2020,23 @@ msgstr "रीपोस्ट दिखाएँ" msgid "Show users" msgstr "लोग दिखाएँ" +#: src/view/com/auth/HomeLoggedOutCTA.tsx:70 #: src/view/com/auth/login/Login.tsx:98 -#: src/view/com/auth/SplashScreen.tsx:49 -#: src/view/shell/NavSignupCard.tsx:52 -#: src/view/shell/NavSignupCard.tsx:53 +#: 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:59 msgid "Sign in" msgstr "साइन इन करें" -#: src/view/com/auth/SplashScreen.tsx:52 -#: src/view/com/auth/SplashScreen.web.tsx:84 +#: src/view/com/auth/HomeLoggedOutCTA.tsx:78 +#: src/view/com/auth/SplashScreen.tsx:57 +#: src/view/com/auth/SplashScreen.web.tsx:87 msgid "Sign In" msgstr "साइन इन करें" @@ -2022,16 +2058,26 @@ msgstr "साइन इन करें" msgid "Sign out" msgstr "साइन आउट" -#: src/view/shell/NavSignupCard.tsx:43 -#: src/view/shell/NavSignupCard.tsx:44 -#: src/view/shell/NavSignupCard.tsx:46 +#: 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:50 +#: src/view/shell/NavSignupCard.tsx:52 msgid "Sign up" msgstr "" -#: src/view/shell/NavSignupCard.tsx:36 +#: src/view/shell/NavSignupCard.tsx:42 msgid "Sign up or sign in to join the conversation" msgstr "" +#: src/view/com/util/moderation/ScreenHider.tsx:76 +msgid "Sign-in Required" +msgstr "" + #: src/view/screens/Settings.tsx:327 msgid "Signed in as" msgstr "आपने इस रूप में साइन इन करा है:" @@ -2069,15 +2115,15 @@ msgstr "Storybook" msgid "Submit" msgstr "" -#: src/view/screens/ProfileList.tsx:597 +#: src/view/screens/ProfileList.tsx:574 msgid "Subscribe" msgstr "सब्सक्राइब" -#: src/view/screens/ProfileList.tsx:593 +#: src/view/screens/ProfileList.tsx:570 msgid "Subscribe to this list" msgstr "इस सूची को सब्सक्राइब करें" -#: src/view/screens/Search/Search.tsx:354 +#: src/view/screens/Search/Search.tsx:357 msgid "Suggested Follows" msgstr "अनुशंसित लोग" @@ -2127,7 +2173,7 @@ msgstr "सामुदायिक दिशानिर्देशों क msgid "The Copyright Policy has been moved to <0/>" msgstr "कॉपीराइट नीति को <0/> पर स्थानांतरित कर दिया गया है" -#: src/view/com/post-thread/PostThread.tsx:437 +#: src/view/com/post-thread/PostThread.tsx:440 msgid "The post may have been deleted." msgstr "हो सकता है कि यह पोस्ट हटा दी गई हो।" @@ -2151,10 +2197,14 @@ msgstr "एप्लिकेशन में एक अप्रत्याश msgid "This {0} has been labeled." msgstr "" -#: src/view/com/util/moderation/ScreenHider.tsx:72 +#: src/view/com/util/moderation/ScreenHider.tsx:88 msgid "This {screenDescription} has been flagged:" msgstr "यह {screenDescription} फ्लैग किया गया है:" +#: src/view/com/util/moderation/ScreenHider.tsx:83 +msgid "This account has requested that users sign in to view their profile." +msgstr "" + #: src/view/com/posts/FeedErrorMessage.tsx:107 msgid "This content is not viewable without a Bluesky account." msgstr "" @@ -2214,11 +2264,11 @@ msgstr "अनुवाद" msgid "Try again" msgstr "फिर से कोशिश करो" -#: src/view/screens/ProfileList.tsx:495 +#: src/view/screens/ProfileList.tsx:472 msgid "Un-block list" msgstr "" -#: src/view/screens/ProfileList.tsx:480 +#: src/view/screens/ProfileList.tsx:457 msgid "Un-mute list" msgstr "" @@ -2254,7 +2304,7 @@ msgstr "अनम्यूट खाता" msgid "Unmute thread" msgstr "थ्रेड को अनम्यूट करें" -#: src/view/screens/ProfileList.tsx:463 +#: src/view/screens/ProfileList.tsx:440 msgid "Unpin moderation list" msgstr "" @@ -2303,7 +2353,7 @@ msgstr "लोग सूचियाँ" msgid "Username or email address" msgstr "यूजर नाम या ईमेल पता" -#: src/view/screens/ProfileList.tsx:767 +#: src/view/screens/ProfileList.tsx:738 msgid "Users" msgstr "यूजर लोग" @@ -2360,7 +2410,7 @@ msgstr "हम आपके हमारी सेवा में शामि #~ msgid "We're sorry, but this feed is currently receiving high traffic and is temporarily unavailable. Please try again later." #~ msgstr "" -#: src/view/screens/Search/Search.tsx:237 +#: src/view/screens/Search/Search.tsx:238 msgid "We're sorry, but your search could not be completed. Please try again in a few minutes." msgstr "" @@ -2376,6 +2426,10 @@ msgstr "<0>Bluesky में आपका स्वागत है" msgid "What is the issue with this {collectionName}?" msgstr "इस {collectionName} के साथ क्या मुद्दा है?" +#: src/view/com/auth/SplashScreen.tsx:34 +msgid "What's up?" +msgstr "" + #: src/view/com/modals/lang-settings/PostLanguagesSettings.tsx:78 msgid "Which languages are used in this post?" msgstr "इस पोस्ट में किस भाषा का उपयोग किया जाता है?" @@ -2397,7 +2451,7 @@ msgstr "" msgid "Wide" msgstr "चौड़ा" -#: src/view/com/composer/Composer.tsx:403 +#: src/view/com/composer/Composer.tsx:409 msgid "Write post" msgstr "पोस्ट लिखो" @@ -2436,16 +2490,16 @@ msgstr "" msgid "You don't have any saved feeds." msgstr "आपके पास कोई सहेजी गई फ़ीड नहीं है." -#: src/view/com/post-thread/PostThread.tsx:385 +#: src/view/com/post-thread/PostThread.tsx:388 msgid "You have blocked the author or you have been blocked by the author." msgstr "आपने लेखक को अवरुद्ध किया है या आपने लेखक द्वारा अवरुद्ध किया है।।" -#: src/view/com/feeds/ProfileFeedgens.tsx:154 +#: src/view/com/feeds/ProfileFeedgens.tsx:141 msgid "You have no feeds." msgstr "" #: src/view/com/lists/MyLists.tsx:89 -#: src/view/com/lists/ProfileLists.tsx:158 +#: src/view/com/lists/ProfileLists.tsx:145 msgid "You have no lists." msgstr "आपके पास कोई सूची नहीं है।।" diff --git a/src/locale/locales/ja/messages.po b/src/locale/locales/ja/messages.po index b6877181c0..7858a85cec 100644 --- a/src/locale/locales/ja/messages.po +++ b/src/locale/locales/ja/messages.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"POT-Creation-Date: 2023-11-22 17:10-0800\n" -"MIME-Version: 1.0\n" +"POT-Creation-Date: 2023-12-18 14:40+0900\n" +"MIME-Version: 2.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: @lingui/cli\n" @@ -9,13 +9,13 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: \n" -"Last-Translator: \n" -"Language-Team: \n" +"Last-Translator: Hima-Zinn\n" +"Language-Team: Hima-Zinn, tkusano, dolciss, oboenikui, noritada\n" "Plural-Forms: \n" #: src/view/shell/desktop/RightNav.tsx:160 msgid "{0, plural, one {# invite code available} other {# invite codes available}}" -msgstr "" +msgstr "{0, plural, other {# 個の招待コードが利用可能}}" #: src/view/com/modals/Repost.tsx:44 msgid "{0}" @@ -27,37 +27,37 @@ msgstr "{0} {purposeLabel} リスト" #: src/view/shell/desktop/RightNav.tsx:143 msgid "{invitesAvailable, plural, one {Invite codes: # available} other {Invite codes: # available}}" -msgstr "" +msgstr "{invitesAvailable, plural, other {招待コード: # 個利用可能}}" #: src/view/screens/Settings.tsx:407 #: src/view/shell/Drawer.tsx:640 msgid "{invitesAvailable} invite code available" -msgstr "" +msgstr "{invitesAvailable}個の招待コードが利用可能" #: src/view/screens/Settings.tsx:409 #: src/view/shell/Drawer.tsx:642 msgid "{invitesAvailable} invite codes available" -msgstr "" +msgstr "{invitesAvailable}個の招待コードが利用可能" -#: src/view/screens/Search/Search.tsx:87 +#: src/view/screens/Search/Search.tsx:88 msgid "{message}" msgstr "{message}" #: src/view/com/threadgate/WhoCanReply.tsx:158 msgid "<0/> members" -msgstr "" +msgstr "<0/>のメンバー" #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:30 msgid "<0>Choose your<1>Recommended<2>Feeds" -msgstr "<1>推奨<2>フィード<0>を選択" +msgstr "<1>おすすめの<2>フィード<0>を選択" #: src/view/com/auth/onboarding/RecommendedFollows.tsx:37 msgid "<0>Follow some<1>Recommended<2>Users" -msgstr "<1>推奨<2>ユーザー<0>をフォロー" +msgstr "<1>おすすめの<2>ユーザー<0>をフォロー" #: src/lib/hooks/useOTAUpdate.ts:16 msgid "A new version of the app is available. Please update to continue using the app." -msgstr "新しいバージョンのアプリが利用可能です。アプリを継続して使用するにはアップデートしてください。" +msgstr "新しいバージョンのアプリが利用可能です。継続して使用するためにはアップデートしてください。" #: src/view/com/modals/EditImage.tsx:299 #: src/view/screens/Settings.tsx:417 @@ -75,15 +75,15 @@ msgstr "アカウントオプション" #: src/view/com/modals/ListAddRemoveUsers.tsx:264 #: src/view/com/modals/UserAddRemoveLists.tsx:193 -#: src/view/screens/ProfileList.tsx:783 +#: src/view/screens/ProfileList.tsx:754 msgid "Add" msgstr "追加" #: src/view/com/modals/SelfLabel.tsx:56 msgid "Add a content warning" -msgstr "コンテンツ警告を追加" +msgstr "コンテンツの警告を追加" -#: src/view/screens/ProfileList.tsx:773 +#: src/view/screens/ProfileList.tsx:744 msgid "Add a user to this list" msgstr "リストにユーザーを追加" @@ -106,13 +106,13 @@ msgstr "詳細を追加" msgid "Add details to report" msgstr "レポートに詳細を追加" -#: src/view/com/composer/Composer.tsx:432 +#: src/view/com/composer/Composer.tsx:438 msgid "Add link card" msgstr "リンクカードを追加" -#: src/view/com/composer/Composer.tsx:435 +#: src/view/com/composer/Composer.tsx:441 msgid "Add link card:" -msgstr "リンクカードの追加:" +msgstr "リンクカードを追加:" #: src/view/com/modals/ChangeHandle.tsx:415 msgid "Add the following DNS record to your domain:" @@ -122,7 +122,7 @@ msgstr "次のDNSレコードをドメインに追加してください:" msgid "Add to Lists" msgstr "リストに追加" -#: src/view/screens/ProfileFeed.tsx:280 +#: src/view/screens/ProfileFeed.tsx:270 msgid "Add to my feeds" msgstr "マイフィードに追加" @@ -141,7 +141,7 @@ msgstr "成人向けコンテンツ" #: src/view/screens/Settings.tsx:569 msgid "Advanced" -msgstr "アドバンス" +msgstr "高度な設定" #: src/view/com/composer/photos/Gallery.tsx:130 msgid "ALT" @@ -153,15 +153,15 @@ msgstr "ALTテキスト" #: src/view/com/composer/photos/Gallery.tsx:209 msgid "Alt text describes images for blind and low-vision users, and helps give context to everyone." -msgstr "ALTテキストは、視覚障害者や低視力者のために画像を説明し、すべての人に文脈を与えるのに役立ちます。" +msgstr "ALTテキストは、すべての人が文脈を理解できるようにするために、視覚障害者や低視力者向けに提供する画像の説明文です。" #: src/view/com/modals/VerifyEmail.tsx:118 msgid "An email has been sent to {0}. It includes a confirmation code which you can enter below." -msgstr "Eメールが{0}に送信されました。以下に入力できる確認コードが含まれています。" +msgstr "メールが{0}に送信されました。以下に入力できる確認コードがそのメールに記載されています。" #: src/view/com/modals/ChangeEmail.tsx:119 msgid "An email has been sent to your previous address, {0}. It includes a confirmation code which you can enter below." -msgstr "以前のアドレス{0}にEメールが送信されました。以下に入力できる確認コードが含まれています。" +msgstr "以前のメールアドレス{0}にメールが送信されました。以下に入力できる確認コードがそのメールに記載されています。" #: src/view/com/notifications/FeedItem.tsx:236 #: src/view/com/threadgate/WhoCanReply.tsx:178 @@ -170,7 +170,7 @@ msgstr "および" #: src/view/screens/LanguageSettings.tsx:95 msgid "App Language" -msgstr "アプリケーション言語" +msgstr "アプリの言語" #: src/view/screens/Settings.tsx:589 msgid "App passwords" @@ -182,15 +182,15 @@ msgstr "アプリパスワード" #: src/view/com/modals/AppealLabel.tsx:65 msgid "Appeal Decision" -msgstr "" +msgstr "判断に異議" #: src/view/com/util/moderation/LabelInfo.tsx:51 msgid "Appeal this decision" -msgstr "" +msgstr "この判断に異議を申し立てる" #: src/view/com/util/moderation/LabelInfo.tsx:55 msgid "Appeal this decision." -msgstr "" +msgstr "この判断に異議を申し立てる" #: src/view/screens/Settings.tsx:432 msgid "Appearance" @@ -200,21 +200,21 @@ msgstr "外観" msgid "Are you sure you want to delete the app password \"{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?" msgstr "本当にこの下書きを破棄しますか?" -#: src/view/screens/ProfileList.tsx:375 +#: src/view/screens/ProfileList.tsx:352 msgid "Are you sure?" -msgstr "本当ですか?" +msgstr "本当によろしいですか?" #: src/view/com/util/forms/PostDropdownBtn.tsx:188 msgid "Are you sure? This cannot be undone." -msgstr "本当ですか?これは元に戻せません。" +msgstr "本当によろしいですか?これは元に戻せません。" #: src/view/com/modals/SelfLabel.tsx:123 msgid "Artistic or non-erotic nudity." -msgstr "芸術的または非エロティックなヌード。" +msgstr "芸術的または性的ではないヌード。" #: src/view/com/auth/create/CreateAccount.tsx:145 #: src/view/com/auth/login/ChooseAccountForm.tsx:151 @@ -222,9 +222,9 @@ msgstr "芸術的または非エロティックなヌード。" #: src/view/com/auth/login/LoginForm.tsx:249 #: src/view/com/auth/login/SetNewPasswordForm.tsx:148 #: src/view/com/modals/report/InputIssueDetails.tsx:45 -#: src/view/com/post-thread/PostThread.tsx:392 -#: src/view/com/post-thread/PostThread.tsx:442 -#: src/view/com/post-thread/PostThread.tsx:450 +#: src/view/com/post-thread/PostThread.tsx:395 +#: src/view/com/post-thread/PostThread.tsx:445 +#: src/view/com/post-thread/PostThread.tsx:453 #: src/view/com/profile/ProfileHeader.tsx:672 msgid "Back" msgstr "戻る" @@ -245,45 +245,49 @@ msgstr "誕生日:" #: src/view/com/profile/ProfileHeader.tsx:282 #: src/view/com/profile/ProfileHeader.tsx:389 msgid "Block Account" -msgstr "アカウントのブロック" +msgstr "アカウントをブロック" -#: src/view/screens/ProfileList.tsx:545 +#: src/view/screens/ProfileList.tsx:522 msgid "Block accounts" -msgstr "アカウントのブロック" +msgstr "アカウントをブロック" -#: src/view/screens/ProfileList.tsx:495 +#: src/view/screens/ProfileList.tsx:472 msgid "Block list" -msgstr "" +msgstr "リストをブロック" -#: src/view/screens/ProfileList.tsx:330 +#: src/view/screens/ProfileList.tsx:307 msgid "Block these accounts?" msgstr "これらのアカウントをブロックしますか?" #: src/view/screens/Moderation.tsx:123 msgid "Blocked accounts" -msgstr "ブロックされたブロック" +msgstr "ブロック中のアカウント" #: src/view/screens/ModerationBlockedAccounts.tsx:106 msgid "Blocked Accounts" -msgstr "ブロックされたアカウント" +msgstr "ブロック中のアカウント" #: src/view/com/profile/ProfileHeader.tsx:284 msgid "Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you." -msgstr "ブロックされたアカウントは、スレッド内で返信したり、ユーザーに言及したり、その他の方法でユーザーとやり取りすることはできません。" +msgstr "ブロック中のアカウントは、あなたのスレッドでの返信、あなたへのメンション、その他の方法であなたとやり取りすることはできません。" #: src/view/screens/ModerationBlockedAccounts.tsx:114 msgid "Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you. You will not see their content and they will be prevented from seeing yours." -msgstr "ブロックされたアカウントは、スレッド内で返信したり、ユーザーに言及したり、その他の方法でユーザーとやり取りすることはできません。あなたは相手のコンテンツを見ることができず、相手はあなたのコンテンツを見ることができなくなります。" +msgstr "ブロック中のアカウントは、あなたのスレッドでの返信、あなたへのメンション、その他の方法であなたとやり取りすることはできません。あなたは相手のコンテンツを見ることができず、相手はあなたのコンテンツを見ることができなくなります。" -#: src/view/com/post-thread/PostThread.tsx:248 +#: src/view/com/post-thread/PostThread.tsx:251 msgid "Blocked post." msgstr "投稿をブロックしました。" -#: src/view/screens/ProfileList.tsx:332 +#: src/view/screens/ProfileList.tsx:309 msgid "Blocking is public. Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you." -msgstr "ブロックは公開されます。ブロックされたアカウントは、スレッド内で返信したり、ユーザーに言及したり、その他の方法でユーザーとやり取りすることはできません。" +msgstr "ブロックしたことは公開されます。ブロック中のアカウントは、あなたのスレッドでの返信、あなたへのメンション、その他の方法であなたとやり取りすることはできません。" -#: src/view/com/auth/SplashScreen.tsx:26 +#: src/view/com/auth/HomeLoggedOutCTA.tsx:93 +msgid "Blog" +msgstr "ブログ" + +#: src/view/com/auth/HomeLoggedOutCTA.tsx:31 msgid "Bluesky" msgstr "Bluesky" @@ -293,19 +297,19 @@ msgstr "Blueskyは柔軟です。" #: src/view/com/auth/onboarding/WelcomeMobile.tsx:69 msgid "Bluesky is open." -msgstr "Blueskyは開いています。" +msgstr "Blueskyは開かれています。" #: src/view/com/auth/onboarding/WelcomeMobile.tsx:56 msgid "Bluesky is public." -msgstr "Blueskyはオープンです。" +msgstr "Blueskyはパブリックです。" #: src/view/com/modals/Waitlist.tsx:70 msgid "Bluesky uses invites to build a healthier community. If you don't know anybody with an invite, you can sign up for the waitlist and we'll send one soon." -msgstr "Blueskyはより健全なコミュニティを構築するために招待状を使用します。招待状をお持ちでない方の場合、waitlistに申し込めば招待状をお送りします。" +msgstr "Blueskyはより健全なコミュニティを構築するために招待状を使用します。招待状をお持ちでない場合、Waitlistにお申し込みいただくと招待状をお送りします。" #: src/view/screens/Moderation.tsx:225 msgid "Bluesky will not show your profile and posts to logged-out users. Other apps may not honor this request. This does not make your account private." -msgstr "" +msgstr "Blueskyはログアウトしたユーザーにあなたのプロフィールや投稿を表示しません。他のアプリはこのリクエストに応じない場合があります。この設定はあなたのアカウントを非公開にするものではありません。" #: src/view/com/modals/ServerInput.tsx:78 msgid "Bluesky.Social" @@ -315,6 +319,10 @@ msgstr "Bluesky.Social" msgid "Build version {0} {1}" msgstr "ビルドバージョン {0} {1}" +#: src/view/com/auth/HomeLoggedOutCTA.tsx:87 +msgid "Business" +msgstr "ビジネス" + #: src/view/com/composer/photos/OpenCameraBtn.tsx:60 #: src/view/com/util/UserAvatar.tsx:221 #: src/view/com/util/UserBanner.tsx:38 @@ -323,10 +331,10 @@ msgstr "カメラ" #: src/view/com/modals/AddAppPasswords.tsx:214 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:282 +#: src/view/com/composer/Composer.tsx:285 +#: src/view/com/composer/Composer.tsx:288 #: src/view/com/modals/AltImage.tsx:127 #: src/view/com/modals/ChangeEmail.tsx:218 #: src/view/com/modals/ChangeEmail.tsx:220 @@ -340,7 +348,7 @@ msgstr "文字、数字、スペース、ハイフン、およびアンダース #: src/view/com/modals/LinkWarning.tsx:85 #: src/view/com/modals/Repost.tsx:73 #: src/view/com/modals/Waitlist.tsx:136 -#: src/view/screens/Search/Search.tsx:558 +#: src/view/screens/Search/Search.tsx:592 #: src/view/shell/desktop/Search.tsx:182 msgid "Cancel" msgstr "キャンセル" @@ -368,7 +376,7 @@ msgstr "プロフィールの編集をキャンセル" #: src/view/com/modals/Repost.tsx:64 msgid "Cancel quote post" -msgstr "引用投稿をキャンセル" +msgstr "引用をキャンセル" #: src/view/com/modals/ListAddRemoveUsers.tsx:87 #: src/view/shell/desktop/Search.tsx:178 @@ -394,23 +402,23 @@ msgstr "ハンドルを変更" #: src/view/com/modals/VerifyEmail.tsx:141 msgid "Change my email" -msgstr "Eメールの変更" +msgstr "メールアドレスを変更" #: src/view/com/modals/ChangeEmail.tsx:109 msgid "Change Your Email" -msgstr "Eメールを変更" +msgstr "メールアドレスを変更" #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:121 msgid "Check out some recommended feeds. Tap + to add them to your list of pinned feeds." -msgstr "推奨フィードを確認してください。「+」をタップすればフィードに追加されます。" +msgstr "おすすめのフィードを確認してください。「+」をタップするとピン留めしたフィードのリストに追加されます。" #: src/view/com/auth/onboarding/RecommendedFollows.tsx:185 msgid "Check out some recommended users. Follow them to see similar users." -msgstr "推奨ユーザーを確認してください。フォローする事であなたに合ったユーザーが見つかるかもしれません。" +msgstr "おすすめのユーザーを確認してください。フォローすることであなたに合ったユーザーが見つかるかもしれません。" #: src/view/com/modals/DeleteAccount.tsx:163 msgid "Check your inbox for an email with the confirmation code to enter below:" -msgstr "Eメールの受信トレイを確認して、以下に入力するコードが記載されたメールが届いていないか確認してください:" +msgstr "入力したメールアドレスの受信トレイを確認して、以下に入力するための確認コードが記載されたメールが届いていないか確認してください:" #: src/view/com/modals/ServerInput.tsx:38 msgid "Choose Service" @@ -418,7 +426,7 @@ msgstr "サービスを選択" #: src/view/com/auth/onboarding/WelcomeMobile.tsx:83 msgid "Choose the algorithms that power your experience with custom feeds." -msgstr "カスタムフィードを使用して経験を強化するアルゴリズムを選択します。" +msgstr "カスタムフィードを使用してあなたの体験を強化するアルゴリズムを選択します。" #: src/view/com/auth/create/Step2.tsx:106 msgid "Choose your password" @@ -430,7 +438,7 @@ msgstr "レガシーストレージデータをすべてクリア" #: src/view/screens/Settings.tsx:696 msgid "Clear all legacy storage data (restart after this)" -msgstr "すべてのレガシーストレージデータをクリア(この後再起動)" +msgstr "すべてのレガシーストレージデータをクリア(この後再起動します)" #: src/view/screens/Settings.tsx:706 msgid "Clear all storage data" @@ -438,10 +446,10 @@ msgstr "すべてのストレージデータをクリア" #: src/view/screens/Settings.tsx:708 msgid "Clear all storage data (restart after this)" -msgstr "すべてのストレージデータをクリア(この後再起動)" +msgstr "すべてのストレージデータをクリア(この後再起動します)" #: src/view/com/util/forms/SearchInput.tsx:73 -#: src/view/screens/Search/Search.tsx:543 +#: src/view/screens/Search/Search.tsx:577 msgid "Clear search query" msgstr "検索クエリをクリア" @@ -489,7 +497,7 @@ msgstr "変更を確認" #: src/view/com/modals/lang-settings/ConfirmLanguagesButton.tsx:34 msgid "Confirm content language settings" -msgstr "コンテンツ言語の設定を確認" +msgstr "コンテンツの言語設定を確認" #: src/view/com/modals/DeleteAccount.tsx:209 msgid "Confirm delete account" @@ -508,24 +516,24 @@ msgstr "接続中..." #: src/view/screens/Moderation.tsx:81 msgid "Content filtering" -msgstr "コンテンツフィルタリング" +msgstr "コンテンツのフィルタリング" #: src/view/com/modals/ContentFilteringSettings.tsx:44 msgid "Content Filtering" -msgstr "コンテンツフィルタリング" +msgstr "コンテンツのフィルタリング" #: src/view/com/modals/lang-settings/ContentLanguagesSettings.tsx:74 #: src/view/screens/LanguageSettings.tsx:278 msgid "Content Languages" -msgstr "コンテンツ言語" +msgstr "コンテンツの言語" -#: src/view/com/util/moderation/ScreenHider.tsx:69 +#: src/view/com/util/moderation/ScreenHider.tsx:78 msgid "Content Warning" -msgstr "コンテンツ警告" +msgstr "コンテンツの警告" #: src/view/com/composer/labels/LabelsBtn.tsx:31 msgid "Content warnings" -msgstr "コンテンツ警告" +msgstr "コンテンツの警告" #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:148 #: src/view/com/auth/onboarding/RecommendedFollows.tsx:209 @@ -535,41 +543,42 @@ msgstr "続行" #: src/view/com/modals/AddAppPasswords.tsx:193 #: src/view/com/modals/InviteCodes.tsx:179 msgid "Copied" -msgstr "コピー済み" +msgstr "コピーしました" #: src/view/com/modals/AddAppPasswords.tsx:186 msgid "Copy" msgstr "コピー" -#: src/view/screens/ProfileList.tsx:407 +#: src/view/screens/ProfileList.tsx:384 msgid "Copy link to list" -msgstr "" +msgstr "リストへのリンクをコピー" #: src/view/com/util/forms/PostDropdownBtn.tsx:129 msgid "Copy link to post" -msgstr "" +msgstr "投稿へのリンクをコピー" #: src/view/com/profile/ProfileHeader.tsx:338 msgid "Copy link to profile" -msgstr "" +msgstr "プロフィールへのリンクをコピー" #: src/view/com/util/forms/PostDropdownBtn.tsx:115 msgid "Copy post text" -msgstr "投稿テキストをコピー" +msgstr "投稿のテキストをコピー" #: src/view/screens/CopyrightPolicy.tsx:29 msgid "Copyright Policy" msgstr "著作権ポリシー" -#: src/view/screens/ProfileFeed.tsx:103 +#: src/view/screens/ProfileFeed.tsx:94 msgid "Could not load feed" -msgstr "フィードのロードに失敗" +msgstr "フィードのロードに失敗しました" -#: src/view/screens/ProfileList.tsx:860 +#: src/view/screens/ProfileList.tsx:830 msgid "Could not load list" -msgstr "リストのロードに失敗" +msgstr "リストのロードに失敗しました" -#: src/view/com/auth/SplashScreen.tsx:41 +#: src/view/com/auth/HomeLoggedOutCTA.tsx:62 +#: src/view/com/auth/SplashScreen.tsx:46 msgid "Create a new account" msgstr "新しいアカウントを作成" @@ -577,7 +586,8 @@ msgstr "新しいアカウントを作成" msgid "Create Account" msgstr "アカウントを作成" -#: src/view/com/auth/SplashScreen.tsx:38 +#: src/view/com/auth/HomeLoggedOutCTA.tsx:54 +#: src/view/com/auth/SplashScreen.tsx:43 msgid "Create new account" msgstr "新しいアカウントを作成" @@ -607,8 +617,8 @@ msgstr "アカウントを削除" msgid "Delete app password" msgstr "アプリパスワードを削除" -#: src/view/screens/ProfileList.tsx:374 -#: src/view/screens/ProfileList.tsx:434 +#: src/view/screens/ProfileList.tsx:351 +#: src/view/screens/ProfileList.tsx:411 msgid "Delete List" msgstr "リストを削除" @@ -628,7 +638,7 @@ msgstr "投稿を削除" msgid "Delete this post?" msgstr "この投稿を削除しますか?" -#: src/view/com/post-thread/PostThread.tsx:240 +#: src/view/com/post-thread/PostThread.tsx:243 msgid "Deleted post." msgstr "投稿を削除しました。" @@ -647,21 +657,21 @@ msgstr "開発者サーバー" msgid "Developer Tools" msgstr "開発者ツール" -#: src/view/com/composer/Composer.tsx:142 +#: src/view/com/composer/Composer.tsx:143 msgid "Discard" msgstr "破棄" -#: src/view/com/composer/Composer.tsx:136 +#: src/view/com/composer/Composer.tsx:137 msgid "Discard draft" -msgstr "ドラフトを破棄" +msgstr "下書きを破棄" #: src/view/screens/Moderation.tsx:207 msgid "Discourage apps from showing my account to logged-out users" -msgstr "" +msgstr "アプリがログアウトしたユーザーに自分のアカウントを表示しないようにする" #: src/view/screens/Feeds.tsx:405 msgid "Discover new feeds" -msgstr "新しいフィードを検出" +msgstr "新しいフィードを見つける" #: src/view/com/modals/EditProfile.tsx:191 msgid "Display name" @@ -696,14 +706,14 @@ msgstr "完了{extraText}" #: src/view/com/modals/InviteCodes.tsx:94 msgid "Each code works once. You'll receive more invite codes periodically." -msgstr "それぞれのコードは一度ずつ動作します。定期的により多くの招待コードを受け取ります。" +msgstr "それぞれのコードは一度ずつ動作します。定期的に招待コードをお送りします。" #: src/view/com/composer/photos/Gallery.tsx:144 #: src/view/com/modals/EditImage.tsx:207 msgid "Edit image" msgstr "画像を編集" -#: src/view/screens/ProfileList.tsx:422 +#: src/view/screens/ProfileList.tsx:399 msgid "Edit list details" msgstr "リストの詳細を編集" @@ -726,34 +736,34 @@ msgstr "プロフィールを編集" #: src/view/screens/Feeds.tsx:330 msgid "Edit Saved Feeds" -msgstr "保存済みフィードを編集" +msgstr "保存されたフィードを編集" #: src/view/com/auth/create/Step2.tsx:90 #: src/view/com/auth/login/ForgotPasswordForm.tsx:148 #: src/view/com/modals/ChangeEmail.tsx:141 #: src/view/com/modals/Waitlist.tsx:88 msgid "Email" -msgstr "Eメール" +msgstr "メールアドレス" #: src/view/com/auth/create/Step2.tsx:81 msgid "Email address" -msgstr "Eメールアドレス" +msgstr "メールアドレス" #: src/view/com/modals/ChangeEmail.tsx:111 msgid "Email Updated" -msgstr "Eメール更新" +msgstr "メールアドレスを更新" #: src/view/screens/Settings.tsx:290 msgid "Email:" -msgstr "Eメール:" +msgstr "メールアドレス:" #: src/view/screens/PreferencesHomeFeed.tsx:138 msgid "Enable this setting to only see replies between people you follow." -msgstr "この設定を有効にすると、フォローしているユーザー間の応答だけが表示されます。" +msgstr "この設定を有効にすると、フォローしているユーザー間の返信だけが表示されます。" -#: src/view/screens/Profile.tsx:471 +#: src/view/screens/Profile.tsx:425 msgid "End of feed" -msgstr "" +msgstr "フィードの終わり" #: src/view/com/auth/create/Step1.tsx:71 msgid "Enter the address of your provider:" @@ -761,15 +771,15 @@ msgstr "プロバイダーのアドレスを入力してください:" #: src/view/com/modals/ChangeHandle.tsx:369 msgid "Enter the domain you want to use" -msgstr "使用するドメインを入力" +msgstr "使用するドメインを入力してください" #: src/view/com/auth/login/ForgotPasswordForm.tsx:101 msgid "Enter the email you used to create your account. We'll send you a \"reset code\" so you can set a new password." -msgstr "アカウントの作成に使用したEメールを入力します。新しいパスワードを設定できるように、「リセットコード」をお送りします。" +msgstr "アカウントの作成に使用したメールアドレスを入力します。新しいパスワードを設定できるように、「リセットコード」をお送りします。" #: src/view/com/auth/create/Step2.tsx:86 msgid "Enter your email address" -msgstr "Eメールアドレスを入力" +msgstr "メールアドレスを入力してください" #: src/view/com/modals/ChangeEmail.tsx:117 msgid "Enter your new email address below." @@ -779,13 +789,13 @@ msgstr "以下に新しいメールアドレスを入力してください。" msgid "Enter your username and password" msgstr "ユーザー名とパスワードを入力" -#: src/view/screens/Search/Search.tsx:105 +#: src/view/screens/Search/Search.tsx:106 msgid "Error:" msgstr "エラー:" #: src/view/com/modals/Threadgate.tsx:76 msgid "Everybody" -msgstr "" +msgstr "全員" #: src/view/com/lightbox/Lightbox.web.tsx:156 msgid "Expand alt text" @@ -794,15 +804,15 @@ msgstr "ALTテキストを展開" #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:109 #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:141 msgid "Failed to load recommended feeds" -msgstr "推奨フィードのロードに失敗" +msgstr "おすすめのフィードのロードに失敗しました" #: src/view/screens/Feeds.tsx:559 msgid "Feed offline" -msgstr "フィードはオフライン" +msgstr "フィードはオフラインです" -#: src/view/com/feeds/FeedPage.tsx:140 +#: src/view/com/feeds/FeedPage.tsx:143 msgid "Feed Preferences" -msgstr "フィード設定" +msgstr "フィードの設定" #: src/view/shell/desktop/RightNav.tsx:65 #: src/view/shell/Drawer.tsx:292 @@ -811,8 +821,8 @@ msgstr "フィードバック" #: src/view/screens/Feeds.tsx:475 #: src/view/screens/Profile.tsx:164 -#: src/view/shell/bottom-bar/BottomBar.tsx:160 -#: src/view/shell/desktop/LeftNav.tsx:333 +#: src/view/shell/bottom-bar/BottomBar.tsx:181 +#: src/view/shell/desktop/LeftNav.tsx:339 #: src/view/shell/Drawer.tsx:455 #: src/view/shell/Drawer.tsx:456 msgid "Feeds" @@ -820,15 +830,23 @@ msgstr "フィード" #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:57 msgid "Feeds are created by users to curate content. Choose some feeds that you find interesting." -msgstr "フィードはコンテンツを整理する為にユーザーによって作成されます。興味具かいフィードをいくつか選択してください。" +msgstr "フィードはコンテンツを整理する為にユーザーによって作成されます。興味のあるフィードをいくつか選択してください。" #: src/view/screens/SavedFeeds.tsx:156 msgid "Feeds are custom algorithms that users build with a little coding expertise. <0/> for more information." msgstr "フィードはユーザーがプログラミングの専門知識を持って構築するカスタムアルゴリズムです。詳細については、<0/>を参照してください。" +#: src/view/screens/Search/Search.tsx:422 +msgid "Find users on Bluesky" +msgstr "Blueskyでユーザーを検索" + +#: src/view/screens/Search/Search.tsx:420 +msgid "Find users with the search tool on the right" +msgstr "右側の検索ツールでユーザーを検索" + #: src/view/com/auth/onboarding/RecommendedFollowsItem.tsx:150 msgid "Finding similar accounts..." -msgstr "似通ったアカウントを検索中..." +msgstr "似ているアカウントを検索中..." #: src/view/screens/PreferencesHomeFeed.tsx:102 msgid "Fine-tune the content you see on your home screen." @@ -844,11 +862,11 @@ msgstr "フォロー" #: src/view/com/auth/onboarding/RecommendedFollows.tsx:64 msgid "Follow some users to get started. We can recommend you more users based on who you find interesting." -msgstr "いくつかのユーザーをフォローして開始します。興味を持っている人に基づいて、より多くのユーザーをお勧めできます。" +msgstr "何人かのユーザーをフォローして開始します。興味を持っている人に基づいて、より多くのユーザーをおすすめします。" #: src/view/com/modals/Threadgate.tsx:98 msgid "Followed users" -msgstr "" +msgstr "フォローしているユーザー" #: src/view/screens/PreferencesHomeFeed.tsx:145 msgid "Followed users only" @@ -873,7 +891,7 @@ msgstr "あなたをフォロー" #: src/view/com/modals/DeleteAccount.tsx:107 msgid "For security reasons, we'll need to send a confirmation code to your email address." -msgstr "セキュリティ上の理由から、Eメールアドレスに確認コードを送信する必要があります。" +msgstr "セキュリティ上の理由から、メールアドレスに確認コードを送信する必要があります。" #: src/view/com/modals/AddAppPasswords.tsx:207 msgid "For security reasons, you won't be able to view this again. If you lose this password, you'll need to generate a new one." @@ -881,16 +899,16 @@ msgstr "セキュリティ上の理由から、これを再度表示すること #: src/view/com/auth/login/LoginForm.tsx:231 msgid "Forgot" -msgstr "失念" +msgstr "忘れた" #: src/view/com/auth/login/LoginForm.tsx:228 msgid "Forgot password" -msgstr "パスワードを失念" +msgstr "パスワードを忘れた" #: src/view/com/auth/login/Login.tsx:127 #: src/view/com/auth/login/Login.tsx:143 msgid "Forgot Password" -msgstr "パスワードを失念" +msgstr "パスワードを忘れた" #: src/view/com/composer/photos/SelectPhotoBtn.tsx:43 msgid "Gallery" @@ -900,17 +918,17 @@ msgstr "ギャラリー" msgid "Get Started" msgstr "はじめに" -#: src/view/com/auth/LoggedOut.tsx:68 -#: src/view/com/auth/LoggedOut.tsx:69 -#: src/view/com/util/moderation/ScreenHider.tsx:105 +#: src/view/com/auth/LoggedOut.tsx:70 +#: src/view/com/auth/LoggedOut.tsx:71 +#: src/view/com/util/moderation/ScreenHider.tsx:123 #: src/view/shell/desktop/LeftNav.tsx:103 msgid "Go back" msgstr "戻る" -#: src/view/screens/ProfileFeed.tsx:112 -#: src/view/screens/ProfileFeed.tsx:117 -#: src/view/screens/ProfileList.tsx:869 -#: src/view/screens/ProfileList.tsx:874 +#: src/view/screens/ProfileFeed.tsx:103 +#: src/view/screens/ProfileFeed.tsx:108 +#: src/view/screens/ProfileList.tsx:839 +#: src/view/screens/ProfileList.tsx:844 msgid "Go Back" msgstr "戻る" @@ -934,41 +952,42 @@ msgid "Here is your app password." msgstr "アプリパスワードをお知らせします。" #: src/view/com/notifications/FeedItem.tsx:316 +#: src/view/com/util/moderation/ContentHider.tsx:103 msgid "Hide" msgstr "非表示" #: src/view/com/notifications/FeedItem.tsx:308 msgid "Hide user list" -msgstr "ユーザーリストを非表示にする" +msgstr "ユーザーリストを非表示" #: src/view/com/posts/FeedErrorMessage.tsx:110 msgid "Hmm, some kind of issue occurred when contacting the feed server. Please let the feed owner know about this issue." -msgstr "" +msgstr "フィードサーバーに問い合わせたところ、なんらかの問題が発生しました。この問題をフィードのオーナーにお知らせください。" #: src/view/com/posts/FeedErrorMessage.tsx:98 msgid "Hmm, the feed server appears to be misconfigured. Please let the feed owner know about this issue." -msgstr "" +msgstr "フィードサーバーの設定が間違っているようです。この問題をフィードのオーナーにお知らせください。" #: src/view/com/posts/FeedErrorMessage.tsx:104 msgid "Hmm, the feed server appears to be offline. Please let the feed owner know about this issue." -msgstr "" +msgstr "フィードサーバーがオフラインのようです。この問題をフィードのオーナーにお知らせください。" #: src/view/com/posts/FeedErrorMessage.tsx:101 msgid "Hmm, the feed server gave a bad response. Please let the feed owner know about this issue." -msgstr "" +msgstr "フィードサーバーの反応が悪いようです。この問題をフィードのオーナーにお知らせください。" #: src/view/com/posts/FeedErrorMessage.tsx:95 msgid "Hmm, 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/desktop/LeftNav.tsx:297 +#: src/view/shell/bottom-bar/BottomBar.tsx:137 +#: src/view/shell/desktop/LeftNav.tsx:303 #: src/view/shell/Drawer.tsx:379 #: src/view/shell/Drawer.tsx:380 msgid "Home" msgstr "ホーム" -#: src/view/com/pager/FeedsTabBarMobile.tsx:99 +#: src/view/com/pager/FeedsTabBarMobile.tsx:96 #: src/view/screens/PreferencesHomeFeed.tsx:95 #: src/view/screens/Settings.tsx:481 msgid "Home Feed Preferences" @@ -981,15 +1000,15 @@ msgstr "ホスティングプロバイダー" #: src/view/com/auth/create/Step1.tsx:76 #: src/view/com/auth/create/Step1.tsx:81 msgid "Hosting provider address" -msgstr "ホスティングプロバイダーアドレス" +msgstr "ホスティングプロバイダーのアドレス" #: src/view/com/modals/VerifyEmail.tsx:208 msgid "I have a code" -msgstr "コードを持っている" +msgstr "コードを持っています" #: src/view/com/modals/ChangeHandle.tsx:281 msgid "I have my own domain" -msgstr "自分のドメインを持っている" +msgstr "自分のドメインを持っています" #: src/view/com/modals/SelfLabel.tsx:127 msgid "If none are selected, suitable for all ages." @@ -1002,7 +1021,7 @@ msgstr "画像のALTテキスト" #: src/view/com/util/UserAvatar.tsx:308 #: src/view/com/util/UserBanner.tsx:116 msgid "Image options" -msgstr "イメージオプション" +msgstr "画像のオプション" #: src/view/com/auth/login/LoginForm.tsx:113 msgid "Invalid username or password" @@ -1015,7 +1034,7 @@ msgstr "招待" #: src/view/com/modals/InviteCodes.tsx:91 #: src/view/screens/Settings.tsx:371 msgid "Invite a Friend" -msgstr "友人を招待" +msgstr "友達を招待" #: src/view/com/auth/create/Step2.tsx:57 msgid "Invite code" @@ -1023,40 +1042,48 @@ msgstr "招待コード" #: src/view/com/auth/create/state.ts:136 msgid "Invite code not accepted. Check that you input it correctly and try again." -msgstr "招待コードが確認できません。正しく入力されている事を確認し、もう一度実行してください。" +msgstr "招待コードが確認できません。正しく入力されていることを確認し、もう一度実行してください。" #: src/view/shell/Drawer.tsx:621 msgid "Invite codes: {invitesAvailable} available" -msgstr "" +msgstr "使用可能な招待コード: {invitesAvailable} 個" + +#: src/view/com/auth/HomeLoggedOutCTA.tsx:99 +msgid "Jobs" +msgstr "仕事" #: src/view/com/modals/Waitlist.tsx:67 msgid "Join the waitlist" -msgstr "待機リストに参加" +msgstr "Waitlistに参加" #: src/view/com/auth/create/Step2.tsx:68 #: src/view/com/auth/create/Step2.tsx:72 msgid "Join the waitlist." -msgstr "待機リストに参加します。" +msgstr "Waitlistに参加します。" #: src/view/com/modals/Waitlist.tsx:124 msgid "Join Waitlist" -msgstr "待機リストに参加" +msgstr "Waitlistに参加" #: src/view/com/composer/select-language/SelectLangBtn.tsx:104 msgid "Language selection" -msgstr "言語選択" +msgstr "言語の選択" #: src/view/screens/LanguageSettings.tsx:89 msgid "Language Settings" -msgstr "言語設定" +msgstr "言語の設定" #: src/view/screens/Settings.tsx:541 msgid "Languages" msgstr "言語" +#: src/view/com/util/moderation/ContentHider.tsx:101 +msgid "Learn more" +msgstr "詳細" + #: src/view/com/util/moderation/PostAlerts.tsx:47 #: src/view/com/util/moderation/ProfileHeaderAlerts.tsx:65 -#: src/view/com/util/moderation/ScreenHider.tsx:88 +#: src/view/com/util/moderation/ScreenHider.tsx:104 msgid "Learn More" msgstr "詳細" @@ -1064,13 +1091,13 @@ msgstr "詳細" #: src/view/com/util/moderation/PostAlerts.tsx:40 #: src/view/com/util/moderation/PostHider.tsx:76 #: src/view/com/util/moderation/ProfileHeaderAlerts.tsx:49 -#: src/view/com/util/moderation/ScreenHider.tsx:85 +#: src/view/com/util/moderation/ScreenHider.tsx:101 msgid "Learn more about this warning" msgstr "この警告の詳細" #: src/view/screens/Moderation.tsx:242 msgid "Learn more about what is public on Bluesky." -msgstr "" +msgstr "Blueskyで公開されている内容はこちらを参照してください。" #: src/view/com/modals/lang-settings/ContentLanguagesSettings.tsx:82 msgid "Leave them all unchecked to see any language." @@ -1090,22 +1117,22 @@ msgstr "パスワードをリセットしましょう!" msgid "Library" msgstr "ライブラリー" -#: src/view/screens/ProfileFeed.tsx:643 +#: src/view/screens/ProfileFeed.tsx:577 msgid "Like this feed" msgstr "このフィードをいいね" #: src/view/screens/PostLikedBy.tsx:27 #: src/view/screens/ProfileFeedLikedBy.tsx:27 msgid "Liked by" -msgstr "いいねした人:" +msgstr "いいねした人" #: src/view/screens/Profile.tsx:163 msgid "Likes" -msgstr "" +msgstr "いいね" #: src/view/screens/Moderation.tsx:203 #~ msgid "Limit the visibility of my account to logged-out users" -#~ msgstr "" +#~ msgstr "ログアウトしたユーザーに対して私のアカウントの閲覧を制限" #: src/view/com/modals/CreateOrEditList.tsx:186 msgid "List Avatar" @@ -1113,27 +1140,27 @@ msgstr "リストアバター" #: src/view/com/modals/CreateOrEditList.tsx:199 msgid "List Name" -msgstr "リスト名" +msgstr "リストの名前" #: src/view/screens/Profile.tsx:165 -#: src/view/shell/desktop/LeftNav.tsx:373 +#: src/view/shell/desktop/LeftNav.tsx:376 #: src/view/shell/Drawer.tsx:471 #: src/view/shell/Drawer.tsx:472 msgid "Lists" msgstr "リスト" -#: src/view/com/post-thread/PostThread.tsx:257 -#: src/view/com/post-thread/PostThread.tsx:265 +#: src/view/com/post-thread/PostThread.tsx:260 +#: src/view/com/post-thread/PostThread.tsx:268 msgid "Load more posts" msgstr "より多くの投稿をロード" -#: src/view/screens/Notifications.tsx:141 +#: src/view/screens/Notifications.tsx:144 msgid "Load new notifications" msgstr "新しい通知をロード" -#: src/view/com/feeds/FeedPage.tsx:185 +#: src/view/com/feeds/FeedPage.tsx:189 msgid "Load new posts" -msgstr "新しい投稿をロード" +msgstr "投稿をロード" #: src/view/com/composer/text-input/mobile/Autocomplete.tsx:95 msgid "Loading..." @@ -1145,68 +1172,67 @@ msgstr "ローカル開発者サーバー" #: src/view/screens/Moderation.tsx:134 #~ msgid "Logged-out users" -#~ msgstr "" +#~ msgstr "ログアウトしたユーザー" #: src/view/screens/Moderation.tsx:136 msgid "Logged-out visibility" -msgstr "" +msgstr "ログアウトした状態の可視性" #: src/view/com/auth/login/ChooseAccountForm.tsx:133 msgid "Login to account that is not listed" msgstr "リストにないアカウントにログイン" -#: src/view/screens/ProfileFeed.tsx:482 -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 "" +#: 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!" +#~ msgstr "このフィードはBlueskyのアカウントを持っているユーザーのみが利用できるようです。このフィードを表示するには、サインアップするかサインインしてください!" #: src/view/com/modals/LinkWarning.tsx:63 msgid "Make sure this is where you intend to go!" -msgstr "意図する場所である事を確認してください!" +msgstr "意図した場所であることを確認してください!" #: src/view/screens/Profile.tsx:162 msgid "Media" -msgstr "" +msgstr "メディア" #: src/view/com/threadgate/WhoCanReply.tsx:139 msgid "mentioned users" -msgstr "" +msgstr "メンションされたユーザー" #: src/view/com/modals/Threadgate.tsx:93 msgid "Mentioned users" -msgstr "" +msgstr "メンションされたユーザー" -#: src/view/screens/Search/Search.tsx:503 +#: src/view/screens/Search/Search.tsx:537 msgid "Menu" msgstr "メニュー" #: src/view/com/posts/FeedErrorMessage.tsx:194 -#: src/view/screens/ProfileFeed.tsx:490 msgid "Message from server" -msgstr "" +msgstr "サーバーからのメッセージ" #: src/view/screens/Moderation.tsx:64 #: src/view/screens/Settings.tsx:563 -#: src/view/shell/desktop/LeftNav.tsx:391 +#: src/view/shell/desktop/LeftNav.tsx:394 #: src/view/shell/Drawer.tsx:490 #: src/view/shell/Drawer.tsx:491 msgid "Moderation" -msgstr "モデレート" +msgstr "モデレーション" #: src/view/screens/Moderation.tsx:95 msgid "Moderation lists" -msgstr "モデレートリスト" +msgstr "モデレーションリスト" #: src/view/screens/ModerationModlists.tsx:58 msgid "Moderation Lists" -msgstr "" +msgstr "モデレーションリスト" #: src/view/shell/desktop/Feeds.tsx:53 msgid "More feeds" msgstr "その他のフィード" #: src/view/com/profile/ProfileHeader.tsx:548 -#: src/view/screens/ProfileFeed.tsx:370 -#: src/view/screens/ProfileList.tsx:606 +#: src/view/screens/ProfileFeed.tsx:360 +#: src/view/screens/ProfileList.tsx:583 msgid "More options" msgstr "その他のオプション" @@ -1214,15 +1240,15 @@ msgstr "その他のオプション" msgid "Mute Account" msgstr "アカウントをミュート" -#: src/view/screens/ProfileList.tsx:533 +#: src/view/screens/ProfileList.tsx:510 msgid "Mute accounts" msgstr "アカウントをミュート" -#: src/view/screens/ProfileList.tsx:480 +#: src/view/screens/ProfileList.tsx:457 msgid "Mute list" -msgstr "" +msgstr "リストをミュート" -#: src/view/screens/ProfileList.tsx:293 +#: src/view/screens/ProfileList.tsx:270 msgid "Mute these accounts?" msgstr "これらのアカウントをミュートしますか?" @@ -1232,19 +1258,19 @@ msgstr "スレッドをミュート" #: src/view/screens/Moderation.tsx:109 msgid "Muted accounts" -msgstr "ミュート済みアカウント" +msgstr "ミュートされたアカウント" #: src/view/screens/ModerationMutedAccounts.tsx:106 msgid "Muted Accounts" -msgstr "ミュート済みアカウント" +msgstr "ミュートされたアカウント" #: src/view/screens/ModerationMutedAccounts.tsx:114 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:295 +#: 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." -msgstr "ミュートはプライベートです。ミュート済みアカウントはユーザーと相互作用することができますが、そのアカウントの投稿や通知を受信することはできません。" +msgstr "ミュートは非公開です。ミュートをされたアカウントはあなたと引き続き関わることができますが、そのアカウントの投稿や通知を受信することはできません。" #: src/view/com/modals/BirthDateSettings.tsx:56 msgid "My Birthday" @@ -1260,7 +1286,7 @@ msgstr "マイプロフィール" #: src/view/screens/Settings.tsx:520 msgid "My Saved Feeds" -msgstr "保存済みフィード" +msgstr "保存されたフィード" #: src/view/com/modals/AddAppPasswords.tsx:177 #: src/view/com/modals/CreateOrEditList.tsx:211 @@ -1269,19 +1295,19 @@ msgstr "名前" #: src/view/com/auth/onboarding/WelcomeMobile.tsx:72 msgid "Never lose access to your followers and data." -msgstr "決してフォロワーやデータへのアクセスを失わないでください。" +msgstr "フォロワーやデータへのアクセスを失うことはありません。" #: src/view/screens/Lists.tsx:76 #: src/view/screens/ModerationModlists.tsx:78 msgid "New" msgstr "新規" -#: src/view/com/feeds/FeedPage.tsx:196 +#: src/view/com/feeds/FeedPage.tsx:200 #: src/view/screens/Feeds.tsx:510 -#: src/view/screens/Profile.tsx:389 -#: src/view/screens/ProfileFeed.tsx:451 -#: src/view/screens/ProfileList.tsx:212 -#: src/view/screens/ProfileList.tsx:244 +#: src/view/screens/Profile.tsx:353 +#: src/view/screens/ProfileFeed.tsx:430 +#: src/view/screens/ProfileList.tsx:193 +#: src/view/screens/ProfileList.tsx:221 #: src/view/shell/desktop/LeftNav.tsx:246 msgid "New post" msgstr "新しい投稿" @@ -1308,32 +1334,32 @@ msgstr "次の画像" #: src/view/screens/PreferencesHomeFeed.tsx:226 #: src/view/screens/PreferencesHomeFeed.tsx:263 msgid "No" -msgstr "なし" +msgstr "いいえ" -#: src/view/screens/ProfileFeed.tsx:636 -#: src/view/screens/ProfileList.tsx:740 +#: src/view/screens/ProfileFeed.tsx:570 +#: src/view/screens/ProfileList.tsx:711 msgid "No description" -msgstr "説明なし" +msgstr "説明はありません" #: src/view/com/composer/text-input/mobile/Autocomplete.tsx:97 msgid "No result" -msgstr "結果なし" +msgstr "結果はありません" #: src/view/screens/Feeds.tsx:452 msgid "No results found for \"{query}\"" -msgstr "「\\{query}」の検索結果がない" +msgstr "「{query}」の検索結果はありません" #: src/view/com/modals/ListAddRemoveUsers.tsx:127 -#: src/view/screens/Search/Search.tsx:270 -#: src/view/screens/Search/Search.tsx:298 -#: src/view/screens/Search/Search.tsx:581 +#: src/view/screens/Search/Search.tsx:271 +#: src/view/screens/Search/Search.tsx:299 +#: src/view/screens/Search/Search.tsx:615 #: src/view/shell/desktop/Search.tsx:210 msgid "No results found for {query}" -msgstr "\\{query}の検索結果がない" +msgstr "「{query}」の検索結果はありません" #: src/view/com/modals/Threadgate.tsx:82 msgid "Nobody" -msgstr "" +msgstr "返信不可" #: src/view/com/modals/SelfLabel.tsx:135 msgid "Not Applicable." @@ -1341,16 +1367,16 @@ msgstr "該当なし。" #: src/view/screens/Moderation.tsx:227 #~ msgid "Note: Bluesky is an open and public network, and enabling this will not make your profile private or limit the ability of logged in users to see your posts. This setting only limits the visibility of posts on the Bluesky app and website; third-party apps that display Bluesky content may not respect this setting, and could show your content to logged-out users." -#~ msgstr "" +#~ msgstr "注記:Blueskyはオープンでパブリックなネットワークであり、この設定を有効にしてもログインしているユーザーはあなたのプロフィールや投稿を制限なく閲覧できます。この設定はBlueskyのアプリおよびウェブサイト上のみでのあなたのコンテンツの可視性を制限するものです。Blueskyのコンテンツを表示するサードパーティーのアプリやウェブサイトなどはこの設定を尊重しない場合があり、ログアウトしたユーザーに対しあなたのコンテンツが表示される可能性があります。" #: src/view/screens/Moderation.tsx:232 msgid "Note: Bluesky is an open and public network. This setting only limits the visibility of your content on the Bluesky app and website, and other apps may not respect this setting. Your content may still be shown to logged-out users by other apps and websites." -msgstr "" +msgstr "注記:Blueskyはオープンでパブリックなネットワークです。この設定はBlueskyのアプリおよびウェブサイト上のみでのあなたのコンテンツの可視性を制限するものであり、他のアプリではこの設定を尊重しない場合があります。他のアプリやウェブサイトでは、ログアウトしたユーザーにあなたのコンテンツが表示される場合があります。" -#: src/view/screens/Notifications.tsx:108 -#: src/view/screens/Notifications.tsx:132 -#: src/view/shell/bottom-bar/BottomBar.tsx:187 -#: src/view/shell/desktop/LeftNav.tsx:355 +#: src/view/screens/Notifications.tsx:109 +#: src/view/screens/Notifications.tsx:133 +#: src/view/shell/bottom-bar/BottomBar.tsx:205 +#: src/view/shell/desktop/LeftNav.tsx:358 #: src/view/shell/Drawer.tsx:416 #: src/view/shell/Drawer.tsx:417 msgid "Notifications" @@ -1364,15 +1390,15 @@ msgstr "ちょっと!" msgid "Okay" msgstr "OK" -#: src/view/com/composer/Composer.tsx:348 +#: src/view/com/composer/Composer.tsx:354 msgid "One or more images is missing alt text." -msgstr "1つ以上の画像にALTテキストがありません。" +msgstr "1つもしくは複数の画像にALTテキストがありません。" #: src/view/com/threadgate/WhoCanReply.tsx:100 msgid "Only {0} can reply." -msgstr "" +msgstr "{0}のみ返信可能" -#: src/view/com/pager/FeedsTabBarMobile.tsx:79 +#: src/view/com/pager/FeedsTabBarMobile.tsx:76 msgid "Open navigation" msgstr "ナビゲーションを開く" @@ -1383,7 +1409,7 @@ msgstr "構成可能な言語設定を開く" #: src/view/shell/desktop/RightNav.tsx:148 #: src/view/shell/Drawer.tsx:622 msgid "Opens list of invite codes" -msgstr "" +msgstr "招待コードのリストを開く" #: src/view/com/modals/ChangeHandle.tsx:279 msgid "Opens modal for using custom domain" @@ -1391,7 +1417,7 @@ msgstr "カスタムドメインを使用するためのモーダルを開く" #: src/view/screens/Settings.tsx:558 msgid "Opens moderation settings" -msgstr "モデレート設定を開く" +msgstr "モデレーションの設定を開く" #: src/view/screens/Settings.tsx:514 msgid "Opens screen with all saved feeds" @@ -1399,11 +1425,11 @@ msgstr "保存されたすべてのフィードで画面を開く" #: src/view/screens/Settings.tsx:581 msgid "Opens the app password settings page" -msgstr "アプリのパスワード設定ページを開く" +msgstr "アプリパスワード設定ページを開く" #: src/view/screens/Settings.tsx:473 msgid "Opens the home feed preferences" -msgstr "ホームフィード設定を開きます" +msgstr "ホームフィードの設定を開く" #: src/view/screens/Settings.tsx:664 msgid "Opens the storybook page" @@ -1415,7 +1441,7 @@ msgstr "システムログのページを開く" #: src/view/screens/Settings.tsx:494 msgid "Opens the threads preferences" -msgstr "スレッド設定を開きます" +msgstr "スレッドの設定を開く" #: src/view/com/auth/login/ChooseAccountForm.tsx:138 msgid "Other account" @@ -1432,7 +1458,7 @@ msgstr "その他..." #: src/view/screens/NotFound.tsx:42 #: src/view/screens/NotFound.tsx:45 msgid "Page not found" -msgstr "ページが見つからない" +msgstr "ページが見つかりません" #: src/view/com/auth/create/Step2.tsx:101 #: src/view/com/auth/create/Step2.tsx:111 @@ -1444,7 +1470,7 @@ msgstr "パスワード" #: src/view/com/auth/login/Login.tsx:157 msgid "Password updated" -msgstr "パスワードが更新された" +msgstr "パスワードが更新されました" #: src/view/com/auth/login/PasswordUpdatedForm.tsx:28 msgid "Password updated!" @@ -1452,11 +1478,11 @@ msgstr "パスワードが更新されました!" #: src/view/com/modals/SelfLabel.tsx:121 msgid "Pictures meant for adults." -msgstr "写真は成人向けです。" +msgstr "成人向けの写真です。" #: src/view/screens/SavedFeeds.tsx:88 msgid "Pinned Feeds" -msgstr "ピン接続フィード" +msgstr "ピン留めされたフィード" #: src/view/com/auth/create/state.ts:116 msgid "Please choose your handle." @@ -1468,7 +1494,7 @@ msgstr "パスワードを選択してください。" #: src/view/com/modals/ChangeEmail.tsx:67 msgid "Please confirm your email before changing it. This is a temporary requirement while email-updating tools are added, and it will soon be removed." -msgstr "変更する前にメールを確認してください。これは、Eメールアップデートツールが追加されている間の一時的な要件であり、まもなく削除されます。" +msgstr "変更する前にメールを確認してください。これは、メールアップデートツールが追加されている間の一時的な要件であり、まもなく削除されます。" #: src/view/com/modals/AddAppPasswords.tsx:140 msgid "Please enter a unique name for this App Password or use our randomly generated one." @@ -1476,7 +1502,7 @@ msgstr "このアプリパスワードに固有の名前を入力するか、ラ #: src/view/com/auth/create/state.ts:95 msgid "Please enter your email." -msgstr "Eメールを入力してください。" +msgstr "メールアドレスを入力してください。" #: src/view/com/modals/DeleteAccount.tsx:180 msgid "Please enter your password as well:" @@ -1485,33 +1511,33 @@ msgstr "パスワードも入力してください:" #: 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 "" +msgstr "この判断が誤っていると考える理由を教えてください。" -#: src/view/com/composer/Composer.tsx:331 -#: src/view/com/post-thread/PostThread.tsx:223 -#: src/view/screens/PostThread.tsx:78 +#: src/view/com/composer/Composer.tsx:337 +#: src/view/com/post-thread/PostThread.tsx:226 +#: src/view/screens/PostThread.tsx:80 msgid "Post" msgstr "投稿" -#: src/view/com/post-thread/PostThread.tsx:382 +#: src/view/com/post-thread/PostThread.tsx:385 msgid "Post hidden" -msgstr "投稿非表示" +msgstr "投稿を非表示" #: src/view/com/composer/select-language/SelectLangBtn.tsx:87 msgid "Post language" -msgstr "ポスト言語" +msgstr "投稿の言語" #: src/view/com/modals/lang-settings/PostLanguagesSettings.tsx:75 msgid "Post Languages" -msgstr "投稿言語" +msgstr "投稿の言語" -#: src/view/com/post-thread/PostThread.tsx:434 +#: src/view/com/post-thread/PostThread.tsx:437 msgid "Post not found" -msgstr "投稿が見つからない" +msgstr "投稿が見つかりません" #: src/view/screens/Profile.tsx:160 msgid "Posts" -msgstr "" +msgstr "投稿" #: src/view/com/modals/LinkWarning.tsx:44 msgid "Potentially Misleading Link" @@ -1527,7 +1553,7 @@ msgstr "第一言語" #: src/view/screens/PreferencesThreads.tsx:91 msgid "Prioritize Your Follows" -msgstr "フォローの優先順位付け" +msgstr "あなたのフォローを優先" #: src/view/shell/desktop/RightNav.tsx:76 msgid "Privacy" @@ -1541,7 +1567,8 @@ msgstr "プライバシーポリシー" msgid "Processing..." 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:525 #: src/view/shell/Drawer.tsx:526 @@ -1550,24 +1577,24 @@ msgstr "プロフィール" #: src/view/screens/Settings.tsx:789 msgid "Protect your account by verifying your email." -msgstr "Eメールを確認してアカウントを保護します。" +msgstr "メールアドレスを確認してアカウントを保護します。" #: src/view/screens/ModerationModlists.tsx:61 msgid "Public, shareable lists of users to mute or block in bulk." -msgstr "" +msgstr "ユーザーを一括でミュートまたはブロックする、公開された共有可能なリスト。" #: src/view/screens/Lists.tsx:61 msgid "Public, shareable lists which can drive feeds." -msgstr "フィードを駆動できるパブリックで共有可能なリスト。" +msgstr "フィードとして利用できる、公開された共有可能なリスト。" #: src/view/com/modals/Repost.tsx:52 #: src/view/com/util/post-ctrls/RepostButton.web.tsx:58 msgid "Quote post" -msgstr "引用投稿" +msgstr "引用" #: src/view/com/modals/Repost.tsx:56 msgid "Quote Post" -msgstr "引用投稿" +msgstr "引用" #: src/view/com/modals/EditImage.tsx:236 msgid "Ratios" @@ -1575,11 +1602,11 @@ msgstr "比率" #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:116 msgid "Recommended Feeds" -msgstr "推奨フィード" +msgstr "おすすめのフィード" #: src/view/com/auth/onboarding/RecommendedFollows.tsx:180 msgid "Recommended Users" -msgstr "推奨ユーザー" +msgstr "おすすめのユーザー" #: src/view/com/modals/ListAddRemoveUsers.tsx:264 #: src/view/com/modals/SelfLabel.tsx:83 @@ -1603,7 +1630,7 @@ msgstr "フィードを削除" #: src/view/com/feeds/FeedSourceCard.tsx:105 #: src/view/com/feeds/FeedSourceCard.tsx:172 -#: src/view/screens/ProfileFeed.tsx:280 +#: src/view/screens/ProfileFeed.tsx:270 msgid "Remove from my feeds" msgstr "マイフィードから削除" @@ -1617,7 +1644,7 @@ msgstr "イメージプレビューを削除" #: src/view/com/feeds/FeedSourceCard.tsx:173 msgid "Remove this feed from my feeds?" -msgstr "" +msgstr "このフィードをマイフィードから削除しますか?" #: src/view/com/posts/FeedErrorMessage.tsx:131 msgid "Remove this feed from your saved feeds?" @@ -1626,53 +1653,53 @@ msgstr "保存したフィードからこのフィードを削除しますか? #: src/view/com/modals/ListAddRemoveUsers.tsx:199 #: src/view/com/modals/UserAddRemoveLists.tsx:136 msgid "Removed from list" -msgstr "リストから削除された" +msgstr "リストから削除されました" #: src/view/screens/Profile.tsx:161 msgid "Replies" -msgstr "" +msgstr "返信" #: src/view/com/threadgate/WhoCanReply.tsx:98 msgid "Replies to this thread are disabled" -msgstr "" +msgstr "このスレッドへの返信はできません" #: src/view/screens/PreferencesHomeFeed.tsx:135 msgid "Reply Filters" -msgstr "返信フィルター" +msgstr "返信のフィルター" #: src/view/com/modals/report/Modal.tsx:166 msgid "Report {collectionName}" -msgstr "レポート \\{collectionName}" +msgstr "{collectionName}を報告" #: src/view/com/profile/ProfileHeader.tsx:404 msgid "Report Account" -msgstr "レポートアカウント" +msgstr "アカウントを報告" -#: src/view/screens/ProfileFeed.tsx:300 +#: src/view/screens/ProfileFeed.tsx:290 msgid "Report feed" -msgstr "レポートフィード" +msgstr "フィードを報告" -#: src/view/screens/ProfileList.tsx:448 +#: src/view/screens/ProfileList.tsx:425 msgid "Report List" -msgstr "レポートリスト" +msgstr "リストを報告" #: src/view/com/modals/report/SendReportButton.tsx:37 #: src/view/com/util/forms/PostDropdownBtn.tsx:165 msgid "Report post" -msgstr "レポート投稿" +msgstr "投稿を報告" #: src/view/com/util/post-ctrls/RepostButton.web.tsx:48 msgid "Repost" -msgstr "再投稿" +msgstr "リポスト" #: src/view/com/util/post-ctrls/RepostButton.web.tsx:94 #: src/view/com/util/post-ctrls/RepostButton.web.tsx:105 msgid "Repost or quote post" -msgstr "再投稿または引用投稿" +msgstr "リポストまたは引用" #: src/view/screens/PostRepostedBy.tsx:27 msgid "Reposted by" -msgstr "再投稿者" +msgstr "リポストした人" #: src/view/com/modals/ChangeEmail.tsx:181 #: src/view/com/modals/ChangeEmail.tsx:183 @@ -1689,7 +1716,7 @@ msgstr "コードをリセット" #: src/view/screens/Settings.tsx:686 msgid "Reset onboarding state" -msgstr "オンボード状態をリセット" +msgstr "オンボーディングの状態をリセット" #: src/view/com/auth/login/ForgotPasswordForm.tsx:98 msgid "Reset password" @@ -1701,11 +1728,11 @@ msgstr "設定をリセット" #: src/view/screens/Settings.tsx:684 msgid "Resets the onboarding state" -msgstr "オンボード状態をリセット" +msgstr "オンボーディングの状態をリセット" #: src/view/screens/Settings.tsx:674 msgid "Resets the preferences state" -msgstr "設定状態をリセット" +msgstr "設定の状態をリセット" #: src/view/com/auth/create/CreateAccount.tsx:167 #: src/view/com/auth/create/CreateAccount.tsx:171 @@ -1744,14 +1771,14 @@ msgstr "画像の切り抜きを保存" #: src/view/screens/SavedFeeds.tsx:122 msgid "Saved Feeds" -msgstr "保存済みフィード" +msgstr "保存されたフィード" #: src/view/com/modals/ListAddRemoveUsers.tsx:75 #: src/view/com/util/forms/SearchInput.tsx:64 -#: src/view/screens/Search/Search.tsx:381 -#: src/view/screens/Search/Search.tsx:533 -#: src/view/shell/bottom-bar/BottomBar.tsx:138 -#: src/view/shell/desktop/LeftNav.tsx:315 +#: src/view/screens/Search/Search.tsx:401 +#: src/view/screens/Search/Search.tsx:567 +#: src/view/shell/bottom-bar/BottomBar.tsx:159 +#: src/view/shell/desktop/LeftNav.tsx:321 #: src/view/shell/desktop/Search.tsx:161 #: src/view/shell/desktop/Search.tsx:170 #: src/view/shell/Drawer.tsx:343 @@ -1760,14 +1787,14 @@ msgid "Search" msgstr "検索" #: src/view/screens/Search/Search.tsx:390 -msgid "Search for posts and users." -msgstr "投稿とユーザーを検索します。" +#~ msgid "Search for posts and users." +#~ msgstr "投稿とユーザーを検索します。" #: src/view/com/modals/ChangeEmail.tsx:110 msgid "Security Step Required" -msgstr "必要なセキュリティ手順" +msgstr "必要なセキュリティの手順" -#: src/view/com/auth/SplashScreen.tsx:29 +#: src/view/com/auth/HomeLoggedOutCTA.tsx:39 msgid "See what's next" msgstr "次を見る" @@ -1785,11 +1812,11 @@ msgstr "サービスを選択" #: src/view/screens/LanguageSettings.tsx:281 msgid "Select which languages you want your subscribed feeds to include. If none are selected, all languages will be shown." -msgstr "登録済みフィードに含める言語を選択します。選択されていない場合は、すべての言語が表示されます。" +msgstr "登録されたフィードに含める言語を選択します。選択されていない場合は、すべての言語が表示されます。" #: src/view/screens/LanguageSettings.tsx:98 msgid "Select your app language for the default text to display in the app" -msgstr "アプリに表示するデフォルトのテキストのアプリ言語を選択する" +msgstr "アプリに表示されるデフォルトのテキストの言語を選択" #: src/view/screens/LanguageSettings.tsx:190 msgid "Select your preferred language for translations in your feed." @@ -1797,15 +1824,15 @@ msgstr "フィード内の翻訳に使用する言語を選択します。" #: src/view/com/modals/VerifyEmail.tsx:196 msgid "Send Confirmation Email" -msgstr "確認Eメールを送信" +msgstr "確認のメールを送信" #: src/view/com/modals/DeleteAccount.tsx:127 msgid "Send email" -msgstr "Eメールを送信" +msgstr "メールを送信" #: src/view/com/modals/DeleteAccount.tsx:138 msgid "Send Email" -msgstr "Eメールを送信" +msgstr "メールを送信" #: src/view/shell/Drawer.tsx:276 #: src/view/shell/Drawer.tsx:297 @@ -1814,7 +1841,7 @@ msgstr "フィードバックを送信" #: src/view/com/modals/report/SendReportButton.tsx:45 msgid "Send Report" -msgstr "レポートを送信" +msgstr "報告を送信" #: src/view/com/auth/login/SetNewPasswordForm.tsx:78 msgid "Set new password" @@ -1822,7 +1849,7 @@ msgstr "新しいパスワードを設定" #: src/view/screens/PreferencesHomeFeed.tsx:216 msgid "Set this setting to \"No\" to hide all quote posts from your feed. Reposts will still be visible." -msgstr "フィードから全ての引用投稿を非表示にするには、この設定を「いいえ」にします。再投稿は引き続き表示されます。" +msgstr "フィードから全ての引用を非表示にするには、この設定を「いいえ」にします。リポストは引き続き表示されます。" #: src/view/screens/PreferencesHomeFeed.tsx:113 msgid "Set this setting to \"No\" to hide all replies from your feed." @@ -1830,7 +1857,7 @@ msgstr "フィードから全ての返信を非表示にするには、この設 #: src/view/screens/PreferencesHomeFeed.tsx:182 msgid "Set this setting to \"No\" to hide all reposts from your feed." -msgstr "フィードから全ての再投稿を非表示にするには、この設定を「いいえ」にします。" +msgstr "フィードから全てのリポストを非表示にするには、この設定を「いいえ」にします。" #: src/view/screens/PreferencesThreads.tsx:116 msgid "Set this setting to \"Yes\" to show replies in a threaded view. This is an experimental feature." @@ -1838,10 +1865,10 @@ msgstr "スレッド表示で返信を表示するには、この設定を「は #: src/view/screens/PreferencesHomeFeed.tsx:252 msgid "Set this setting to \"Yes\" to show samples of your saved feeds in your following feed. This is an experimental feature." -msgstr "保存したフィードのサンプルを次のフィードに表示するには、この設定を「はい」にします。これは実験的な機能です。" +msgstr "保存されたフィードのサンプルを次のフィードに表示するには、この設定を「はい」にします。これは実験的な機能です。" #: src/view/screens/Settings.tsx:277 -#: src/view/shell/desktop/LeftNav.tsx:427 +#: src/view/shell/desktop/LeftNav.tsx:430 #: src/view/shell/Drawer.tsx:546 #: src/view/shell/Drawer.tsx:547 msgid "Settings" @@ -1849,23 +1876,24 @@ msgstr "設定" #: src/view/com/modals/SelfLabel.tsx:125 msgid "Sexual activity or erotic nudity." -msgstr "性行為またはエロティックなヌード。" +msgstr "性的行為または性的なヌード。" #: src/view/com/profile/ProfileHeader.tsx:338 #: src/view/com/util/forms/PostDropdownBtn.tsx:129 -#: src/view/screens/ProfileList.tsx:407 +#: src/view/screens/ProfileList.tsx:384 msgid "Share" msgstr "共有" -#: src/view/screens/ProfileFeed.tsx:312 +#: src/view/screens/ProfileFeed.tsx:302 msgid "Share feed" msgstr "フィードを共有" +#: src/view/com/util/moderation/ContentHider.tsx:105 #: src/view/screens/Settings.tsx:316 msgid "Show" msgstr "表示" -#: src/view/com/util/moderation/ScreenHider.tsx:114 +#: src/view/com/util/moderation/ScreenHider.tsx:132 msgid "Show anyway" msgstr "とにかく表示" @@ -1875,7 +1903,7 @@ msgstr "マイフィードからの投稿を表示" #: src/view/screens/PreferencesHomeFeed.tsx:213 msgid "Show Quote Posts" -msgstr "引用投稿を表示" +msgstr "引用を表示" #: src/view/screens/PreferencesHomeFeed.tsx:110 msgid "Show Replies" @@ -1887,21 +1915,29 @@ msgstr "他のすべての返信の前に、フォローしている人からの #: src/view/screens/PreferencesHomeFeed.tsx:179 msgid "Show Reposts" -msgstr "再投稿を表示" +msgstr "リポストを表示" #: src/view/com/notifications/FeedItem.tsx:337 msgid "Show users" msgstr "ユーザーを表示" +#: src/view/com/auth/HomeLoggedOutCTA.tsx:70 #: src/view/com/auth/login/Login.tsx:98 -#: src/view/com/auth/SplashScreen.tsx:49 -#: src/view/shell/NavSignupCard.tsx:52 -#: src/view/shell/NavSignupCard.tsx:53 +#: 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:59 msgid "Sign in" msgstr "サインイン" -#: src/view/com/auth/SplashScreen.tsx:52 -#: src/view/com/auth/SplashScreen.web.tsx:84 +#: src/view/com/auth/HomeLoggedOutCTA.tsx:78 +#: src/view/com/auth/SplashScreen.tsx:57 +#: src/view/com/auth/SplashScreen.web.tsx:87 msgid "Sign In" msgstr "サインイン" @@ -1912,7 +1948,7 @@ msgstr "{0}としてサインイン" #: src/view/com/auth/login/ChooseAccountForm.tsx:118 #: src/view/com/auth/login/Login.tsx:116 msgid "Sign in as..." -msgstr "...としてサインイン" +msgstr "アカウントの選択" #: src/view/com/auth/login/LoginForm.tsx:130 msgid "Sign into" @@ -1923,15 +1959,25 @@ msgstr "サインイン" msgid "Sign out" msgstr "サインアウト" -#: src/view/shell/NavSignupCard.tsx:43 -#: src/view/shell/NavSignupCard.tsx:44 -#: src/view/shell/NavSignupCard.tsx:46 +#: 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:50 +#: src/view/shell/NavSignupCard.tsx:52 msgid "Sign up" msgstr "サインアップ" -#: src/view/shell/NavSignupCard.tsx:36 +#: src/view/shell/NavSignupCard.tsx:42 msgid "Sign up or sign in to join the conversation" -msgstr "登録またはログインして会話に参加する" +msgstr "登録またはログインして会話に参加" + +#: src/view/com/util/moderation/ScreenHider.tsx:76 +msgid "Sign-in Required" +msgstr "サインインが必要" #: src/view/screens/Settings.tsx:327 msgid "Signed in as" @@ -1968,19 +2014,19 @@ msgstr "ストーリーブック" #: src/view/com/modals/AppealLabel.tsx:101 msgid "Submit" -msgstr "" +msgstr "送信" -#: src/view/screens/ProfileList.tsx:597 +#: src/view/screens/ProfileList.tsx:574 msgid "Subscribe" msgstr "登録" -#: src/view/screens/ProfileList.tsx:593 +#: src/view/screens/ProfileList.tsx:570 msgid "Subscribe to this list" msgstr "このリストに登録" -#: src/view/screens/Search/Search.tsx:354 +#: src/view/screens/Search/Search.tsx:357 msgid "Suggested Follows" -msgstr "推奨されるフォロー" +msgstr "おすすめのフォロー" #: src/view/screens/Support.tsx:30 #: src/view/screens/Support.tsx:33 @@ -2010,35 +2056,35 @@ msgstr "利用規約" #: src/view/com/modals/AppealLabel.tsx:70 #: src/view/com/modals/report/InputIssueDetails.tsx:50 msgid "Text input field" -msgstr "テキスト入力フィールド" +msgstr "テキストの入力フィールド" #: src/view/com/profile/ProfileHeader.tsx:306 msgid "The account will be able to interact with you after unblocking." -msgstr "このアカウントは、ブロック解除後にお客様とやり取りすることができます。" +msgstr "このアカウントは、ブロック解除後にあなたとやり取りすることができます。" #: src/view/screens/CommunityGuidelines.tsx:36 msgid "The Community Guidelines have been moved to <0/>" -msgstr "コミュニティ ガイドラインが<0/>に移動された" +msgstr "コミュニティガイドラインは<0/>に移動されました" #: src/view/screens/CopyrightPolicy.tsx:33 msgid "The Copyright Policy has been moved to <0/>" -msgstr "著作権ポリシーが<0/>に移動された" +msgstr "著作権ポリシーが<0/>に移動されました" -#: src/view/com/post-thread/PostThread.tsx:437 +#: src/view/com/post-thread/PostThread.tsx:440 msgid "The post may have been deleted." msgstr "投稿が削除された可能性があります。" #: src/view/screens/PrivacyPolicy.tsx:33 msgid "The Privacy Policy has been moved to <0/>" -msgstr "プライバシーポリシーが<0/>に移動された" +msgstr "プライバシーポリシーが<0/>に移動されました" #: src/view/screens/Support.tsx:36 msgid "The support form has been moved. If you need help, please<0/> or visit {HELP_DESK_URL} to get in touch with us." -msgstr "サポートフォームが移動しました。サポートが必要な場合は、<0/>または\\{HELP_DESK_URL}にアクセスしてご連絡ください。" +msgstr "サポートフォームが移動しました。サポートが必要な場合は、<0/>または{HELP_DESK_URL}にアクセスしてご連絡ください。" #: src/view/screens/TermsOfService.tsx:33 msgid "The Terms of Service have been moved to" -msgstr "サービス規約が移動された" +msgstr "サービス規約が移動されました" #: src/view/com/util/ErrorBoundary.tsx:35 msgid "There was an unexpected issue in the application. Please let us know if this happened to you!" @@ -2046,19 +2092,23 @@ msgstr "アプリケーションに予期しない問題が発生しました。 #: src/view/com/util/moderation/LabelInfo.tsx:45 msgid "This {0} has been labeled." -msgstr "" +msgstr "この{0}にはラベルが貼られています" -#: src/view/com/util/moderation/ScreenHider.tsx:72 +#: src/view/com/util/moderation/ScreenHider.tsx:88 msgid "This {screenDescription} has been flagged:" -msgstr "この\\{screenDescription}にはフラグが設定されています。" +msgstr "この{screenDescription}にはフラグが設定されています:" + +#: src/view/com/util/moderation/ScreenHider.tsx:83 +msgid "This account has requested that users sign in to view their profile." +msgstr "このアカウントを閲覧するためにはサインインが必要です。" #: src/view/com/posts/FeedErrorMessage.tsx:107 msgid "This content is not viewable without a Bluesky account." -msgstr "" +msgstr "このコンテンツはBlueskyのアカウントがないと閲覧できません。" #: src/view/com/posts/FeedErrorMessage.tsx:113 msgid "This feed is currently receiving high traffic and is temporarily unavailable. Please try again later." -msgstr "" +msgstr "現在このフィードにはアクセスが集中しており、一時的にご利用いただけません。時間をおいてもう一度お試しください。" #: src/view/com/modals/BirthDateSettings.tsx:61 msgid "This information is not shared with other users." @@ -2066,7 +2116,7 @@ msgstr "この情報は他のユーザーと共有されません。" #: src/view/com/modals/VerifyEmail.tsx:113 msgid "This is important in case you ever need to change your email or reset your password." -msgstr "これは、Eメールの変更やパスワードのリセットが必要な場合に重要です。" +msgstr "これは、メールアドレスの変更やパスワードのリセットが必要な場合に重要です。" #: src/view/com/auth/create/Step1.tsx:55 msgid "This is the service that keeps you online." @@ -2095,7 +2145,7 @@ msgstr "スレッドモード" #: src/view/com/util/forms/DropdownButton.tsx:230 msgid "Toggle dropdown" -msgstr "トグルドロップダウン" +msgstr "ドロップダウンをトグル" #: src/view/com/modals/EditImage.tsx:271 msgid "Transformations" @@ -2111,33 +2161,33 @@ msgstr "翻訳" msgid "Try again" msgstr "再試行" -#: src/view/screens/ProfileList.tsx:495 +#: src/view/screens/ProfileList.tsx:472 msgid "Un-block list" -msgstr "" +msgstr "リストでのブロックを解除" -#: src/view/screens/ProfileList.tsx:480 +#: src/view/screens/ProfileList.tsx:457 msgid "Un-mute list" -msgstr "" +msgstr "リストでのミュートを解除" #: src/view/com/auth/create/CreateAccount.tsx:64 #: src/view/com/auth/login/Login.tsx:76 #: src/view/com/auth/login/LoginForm.tsx:117 msgid "Unable to contact your service. Please check your Internet connection." -msgstr "サービスに接続できません。インターネット接続を確認してください。" +msgstr "あなたのサービスに接続できません。インターネットの接続を確認してください。" #: src/view/com/profile/ProfileHeader.tsx:466 #: src/view/com/profile/ProfileHeader.tsx:469 msgid "Unblock" -msgstr "ブロック解除" +msgstr "ブロックを解除" #: src/view/com/profile/ProfileHeader.tsx:304 #: src/view/com/profile/ProfileHeader.tsx:388 msgid "Unblock Account" -msgstr "アカウントのブロック解除" +msgstr "アカウントのブロックを解除" #: src/view/com/util/post-ctrls/RepostButton.web.tsx:48 msgid "Undo repost" -msgstr "再投稿を元に戻す" +msgstr "リポストを元に戻す" #: src/view/com/auth/create/state.ts:210 msgid "Unfortunately, you do not meet the requirements to create an account." @@ -2145,19 +2195,19 @@ msgstr "残念ながら、アカウントを作成するための要件を満た #: src/view/com/profile/ProfileHeader.tsx:369 msgid "Unmute Account" -msgstr "アカウントのミュート解除" +msgstr "アカウントのミュートを解除" #: src/view/com/util/forms/PostDropdownBtn.tsx:147 msgid "Unmute thread" -msgstr "スレッドのミュート解除" +msgstr "スレッドのミュートを解除" -#: src/view/screens/ProfileList.tsx:463 +#: src/view/screens/ProfileList.tsx:440 msgid "Unpin moderation list" -msgstr "" +msgstr "モデレーションリストのピン留めを解除" #: src/view/com/modals/UserAddRemoveLists.tsx:54 msgid "Update {displayName} in Lists" -msgstr "リストの\\{displayName}を更新" +msgstr "リストの{displayName}を更新" #: src/lib/hooks/useOTAUpdate.ts:15 msgid "Update Available" @@ -2198,36 +2248,36 @@ msgstr "ユーザーリスト" #: src/view/com/auth/login/LoginForm.tsx:170 #: src/view/com/auth/login/LoginForm.tsx:187 msgid "Username or email address" -msgstr "ユーザー名またはEメールアドレス" +msgstr "ユーザー名またはメールアドレス" -#: src/view/screens/ProfileList.tsx:767 +#: src/view/screens/ProfileList.tsx:738 msgid "Users" msgstr "ユーザー" #: src/view/com/threadgate/WhoCanReply.tsx:143 msgid "users followed by <0/>" -msgstr "" +msgstr "<0/>にフォローされているユーザー" #: src/view/com/modals/Threadgate.tsx:106 msgid "Users in \"{0}\"" -msgstr "" +msgstr "{0}のユーザー" #: src/view/screens/Settings.tsx:750 msgid "Verify email" -msgstr "Eメールを確認" +msgstr "メールアドレスを確認" #: src/view/screens/Settings.tsx:775 msgid "Verify my email" -msgstr "Eメールを確認" +msgstr "メールアドレスを確認" #: src/view/screens/Settings.tsx:784 msgid "Verify My Email" -msgstr "Eメールを確認" +msgstr "メールアドレスを確認" #: src/view/com/modals/ChangeEmail.tsx:205 #: src/view/com/modals/ChangeEmail.tsx:207 msgid "Verify New Email" -msgstr "新しいEメールを確認" +msgstr "新しいメールアドレスを確認" #: src/view/screens/Log.tsx:52 msgid "View debug entry" @@ -2243,15 +2293,15 @@ msgstr "サイトへアクセス" #: src/view/com/auth/create/CreateAccount.tsx:125 msgid "We're so excited to have you join us!" -msgstr "あなたが参加してくれることをとても楽しみにしています!" +msgstr "私たちはあなたが参加してくれることをとても楽しみにしています!" -#: src/view/screens/Search/Search.tsx:237 +#: src/view/screens/Search/Search.tsx:238 msgid "We're sorry, but your search could not be completed. Please try again in a few minutes." -msgstr "申し訳ありませんが、検索を完了できませんでした。数分後に再試行してください。" +msgstr "大変申し訳ありませんが、検索を完了できませんでした。数分後に再試行してください。" #: src/view/screens/NotFound.tsx:48 msgid "We're sorry! We can't find the page you were looking for." -msgstr "申し訳ありません! お探しのページが見つかりません。" +msgstr "大変申し訳ありません!お探しのページが見つかりません。" #: src/view/com/auth/onboarding/WelcomeMobile.tsx:46 msgid "Welcome to <0>Bluesky" @@ -2259,7 +2309,11 @@ msgstr "<0>Blueskyへようこそ" #: src/view/com/modals/report/Modal.tsx:169 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 msgid "Which languages are used in this post?" @@ -2267,18 +2321,18 @@ msgstr "この投稿ではどの言語が使われていますか?" #: src/view/com/modals/lang-settings/ContentLanguagesSettings.tsx:77 msgid "Which languages would you like to see in your algorithmic feeds?" -msgstr "アルゴリズムフィードに表示する言語を選択しますか?" +msgstr "アルゴリズムによるフィードにはどの言語を使用しますか?" #: src/view/com/composer/threadgate/ThreadgateBtn.tsx:47 #: src/view/com/modals/Threadgate.tsx:66 msgid "Who can reply" -msgstr "" +msgstr "返信できる人" #: src/view/com/modals/crop-image/CropImage.web.tsx:102 msgid "Wide" msgstr "ワイド" -#: src/view/com/composer/Composer.tsx:403 +#: src/view/com/composer/Composer.tsx:409 msgid "Write post" msgstr "投稿を書く" @@ -2307,7 +2361,7 @@ msgstr "まだ招待コードがありません!Blueskyをもうしばらく #: src/view/screens/SavedFeeds.tsx:102 msgid "You don't have any pinned feeds." -msgstr "ピンで固定されたフィードがありません。" +msgstr "ピン留めされたフィードがありません。" #: src/view/screens/Feeds.tsx:383 msgid "You don't have any saved feeds!" @@ -2317,26 +2371,26 @@ msgstr "保存されたフィードがありません!" msgid "You don't have any saved feeds." msgstr "保存されたフィードがありません。" -#: src/view/com/post-thread/PostThread.tsx:385 +#: src/view/com/post-thread/PostThread.tsx:388 msgid "You have blocked the author or you have been blocked by the author." -msgstr "著者をブロックしたか、または著者によってブロックされました。" +msgstr "あなたが著者をブロックしているか、または著者によってあなたはブロックされています。" -#: src/view/com/feeds/ProfileFeedgens.tsx:154 +#: src/view/com/feeds/ProfileFeedgens.tsx:141 msgid "You have no feeds." -msgstr "" +msgstr "フィードがありません。" #: src/view/com/lists/MyLists.tsx:89 -#: src/view/com/lists/ProfileLists.tsx:158 +#: src/view/com/lists/ProfileLists.tsx:145 msgid "You have no lists." msgstr "リストがありません。" #: src/view/screens/ModerationBlockedAccounts.tsx:131 msgid "You have not blocked any accounts yet. To block an account, go to their profile and selected \"Block account\" from the menu on their account." -msgstr "ブロックしているアカウントはまだありません。アカウントをブロックするには、ユーザーのプロフィールに移動し、アカウントメニューから「アカウントをブロック」を選択します。" +msgstr "ブロック中のアカウントはまだありません。アカウントをブロックするには、ユーザーのプロフィールに移動し、アカウントメニューから「アカウントをブロック」を選択します。" #: src/view/screens/AppPasswords.tsx:86 msgid "You have not created any app passwords yet. You can create one by pressing the button below." -msgstr "アプリパスワードはまだ作成されていません。 下のボタンを押すと作成できます。" +msgstr "アプリパスワードはまだ作成されていません。下のボタンを押すと作成できます。" #: src/view/screens/ModerationMutedAccounts.tsx:130 msgid "You have not muted any accounts yet. To mute an account, go to their profile and selected \"Mute account\" from the menu on their account." @@ -2344,11 +2398,11 @@ msgstr "ミュートしているアカウントはまだありません。アカ #: src/view/com/auth/login/SetNewPasswordForm.tsx:81 msgid "You will receive an email with a \"reset code.\" Enter that code here, then enter your new password." -msgstr "「リセットコード」が記載されたEメールが届きます。ここにコードを入力し、新しいパスワードを入力します。" +msgstr "「リセットコード」が記載されたメールが届きます。ここにコードを入力し、新しいパスワードを入力します。" #: src/view/com/auth/create/Step2.tsx:43 msgid "Your account" -msgstr "アカウント" +msgstr "あなたのアカウント" #: src/view/com/auth/create/Step2.tsx:122 msgid "Your birth date" @@ -2356,19 +2410,19 @@ msgstr "生年月日" #: src/view/com/auth/create/state.ts:102 msgid "Your email appears to be invalid." -msgstr "Eメールが無効なようです。" +msgstr "メールアドレスが無効なようです。" #: src/view/com/modals/Waitlist.tsx:107 msgid "Your email has been saved! We'll be in touch soon." -msgstr "Eメールが保存されました!すぐにご連絡いたします。" +msgstr "メールアドレスが保存されました!すぐにご連絡いたします。" #: src/view/com/modals/ChangeEmail.tsx:125 msgid "Your email has been updated but not verified. As a next step, please verify your new email." -msgstr "Eメールは更新されましたが、確認されていません。次のステップとして、新しいEメールを確認してください。" +msgstr "メールアドレスは更新されましたが、確認されていません。次のステップとして、新しいEメールを確認してください。" #: src/view/com/modals/VerifyEmail.tsx:108 msgid "Your email has not yet been verified. This is an important security step which we recommend." -msgstr "Eメールはまだ確認されていません。これは、当社が推奨する重要なセキュリティステップです。" +msgstr "メールアドレスはまだ確認されていません。これは、当社が推奨する重要なセキュリティステップです。" #: src/view/com/auth/create/Step3.tsx:42 #: src/view/com/modals/ChangeHandle.tsx:270 @@ -2383,20 +2437,20 @@ msgstr "ホスティングプロバイダー" #: src/view/shell/desktop/RightNav.tsx:129 #: src/view/shell/Drawer.tsx:636 msgid "Your invite codes are hidden when logged in using an App Password" -msgstr "" +msgstr "アプリパスワードを使用してログインすると、招待コードは非表示になります。" #: src/view/com/auth/onboarding/WelcomeMobile.tsx:59 msgid "Your posts, likes, and blocks are public. Mutes are private." -msgstr "投稿、いいね、ブロックは公開されます。ミュートはプライベートです。" +msgstr "投稿、いいね、ブロックは公開されます。ミュートは非公開です。" #: src/view/com/modals/SwitchAccount.tsx:82 msgid "Your profile" -msgstr "プロフィール" +msgstr "あなたのプロフィール" #: src/view/screens/Moderation.tsx:220 #~ msgid "Your profile and posts will not be visible to people visiting the Bluesky app or website without having an account and being logged in." -#~ msgstr "" +#~ msgstr "あなたのプロフィールと投稿は、アカウントを持っておらずログインしていない状態でBlueskyのアプリまたはウェブサイトを訪問する人々には表示されません。" #: src/view/com/auth/create/Step3.tsx:28 msgid "Your user handle" -msgstr "ユーザーハンドル" +msgstr "あなたのユーザーハンドル" diff --git a/src/state/queries/actor-autocomplete.ts b/src/state/queries/actor-autocomplete.ts index fbd1b38f9d..fe207371d0 100644 --- a/src/state/queries/actor-autocomplete.ts +++ b/src/state/queries/actor-autocomplete.ts @@ -1,16 +1,27 @@ import React from 'react' -import {AppBskyActorDefs} from '@atproto/api' +import {AppBskyActorDefs, ModerationOpts, moderateProfile} from '@atproto/api' import {useQuery, useQueryClient} from '@tanstack/react-query' import {logger} from '#/logger' import {getAgent} from '#/state/session' import {useMyFollowsQuery} from '#/state/queries/my-follows' import {STALE} from '#/state/queries' +import { + DEFAULT_LOGGED_OUT_PREFERENCES, + getModerationOpts, + useModerationOpts, +} from './preferences' + +const DEFAULT_MOD_OPTS = getModerationOpts({ + userDid: '', + preferences: DEFAULT_LOGGED_OUT_PREFERENCES, +}) export const RQKEY = (prefix: string) => ['actor-autocomplete', prefix] export function useActorAutocompleteQuery(prefix: string) { const {data: follows, isFetching} = useMyFollowsQuery() + const moderationOpts = useModerationOpts() return useQuery({ staleTime: STALE.MINUTES.ONE, @@ -22,9 +33,20 @@ export function useActorAutocompleteQuery(prefix: string) { limit: 8, }) : undefined - return computeSuggestions(prefix, follows, res?.data.actors) + return res?.data.actors || [] }, enabled: !isFetching, + select: React.useCallback( + (data: AppBskyActorDefs.ProfileViewBasic[]) => { + return computeSuggestions( + prefix, + follows, + data, + moderationOpts || DEFAULT_MOD_OPTS, + ) + }, + [prefix, follows, moderationOpts], + ), }) } @@ -32,6 +54,7 @@ export type ActorAutocompleteFn = ReturnType export function useActorAutocompleteFn() { const queryClient = useQueryClient() const {data: follows} = useMyFollowsQuery() + const moderationOpts = useModerationOpts() return React.useCallback( async ({query, limit = 8}: {query: string; limit?: number}) => { @@ -54,9 +77,14 @@ export function useActorAutocompleteFn() { } } - return computeSuggestions(query, follows, res?.data.actors) + return computeSuggestions( + query, + follows, + res?.data.actors, + moderationOpts || DEFAULT_MOD_OPTS, + ) }, - [follows, queryClient], + [follows, queryClient, moderationOpts], ) } @@ -64,6 +92,7 @@ function computeSuggestions( prefix: string, follows: AppBskyActorDefs.ProfileViewBasic[] | undefined, searched: AppBskyActorDefs.ProfileViewBasic[] = [], + moderationOpts: ModerationOpts, ) { let items: AppBskyActorDefs.ProfileViewBasic[] = [] if (follows) { @@ -76,10 +105,14 @@ function computeSuggestions( handle: item.handle, displayName: item.displayName, avatar: item.avatar, + labels: item.labels, }) } } - return items + return items.filter(profile => { + const mod = moderateProfile(profile, moderationOpts) + return !mod.account.filter + }) } function prefixMatch( diff --git a/src/state/queries/feed.ts b/src/state/queries/feed.ts index e431643e71..c9d81bc170 100644 --- a/src/state/queries/feed.ts +++ b/src/state/queries/feed.ts @@ -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 function useGetPopularFeedsQuery() { diff --git a/src/state/queries/notifications/feed.ts b/src/state/queries/notifications/feed.ts index dc206df79a..d652f493df 100644 --- a/src/state/queries/notifications/feed.ts +++ b/src/state/queries/notifications/feed.ts @@ -16,7 +16,7 @@ * 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 { useInfiniteQuery, @@ -49,6 +49,7 @@ export function useNotificationFeedQuery(opts?: {enabled?: boolean}) { const threadMutes = useMutedThreads() const unreads = useUnreadNotificationsApi() const enabled = opts?.enabled !== false + const lastPageCountRef = useRef(0) const query = useInfiniteQuery< FeedPage, @@ -104,24 +105,26 @@ export function useNotificationFeedQuery(opts?: {enabled?: boolean}) { useEffect(() => { const {isFetching, hasNextPage, data} = query - - let count = 0 - let numEmpties = 0 - for (const page of data?.pages || []) { - if (!page.items.length) { - numEmpties++ - } - count += page.items.length + if (isFetching || !hasNextPage) { + return } + // avoid double-fires of fetchNextPage() if ( - !isFetching && - hasNextPage && - count < PAGE_SIZE && - numEmpties < 3 && - (data?.pages.length || 0) < 6 + 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 + for (const page of data?.pages || []) { + count += page.items.length + } + if (count < PAGE_SIZE && (data?.pages.length || 0) < 6) { query.fetchNextPage() + lastPageCountRef.current = data?.pages?.length || 0 } }, [query]) diff --git a/src/state/queries/post-feed.ts b/src/state/queries/post-feed.ts index efdb42dd2b..b91af372f0 100644 --- a/src/state/queries/post-feed.ts +++ b/src/state/queries/post-feed.ts @@ -1,4 +1,4 @@ -import React, {useCallback, useEffect} from 'react' +import React, {useCallback, useEffect, useRef} from 'react' import { AppBskyFeedDefs, AppBskyFeedPost, @@ -78,6 +78,7 @@ export interface FeedPageUnselected { api: FeedAPI cursor: string | undefined feed: AppBskyFeedDefs.FeedViewPost[] + fetchedAt: number } export interface FeedPage { @@ -85,6 +86,7 @@ export interface FeedPage { tuner: FeedTuner | NoopFeedTuner cursor: string | undefined slices: FeedPostSlice[] + fetchedAt: number } const PAGE_SIZE = 30 @@ -98,11 +100,12 @@ export function usePostFeedQuery( const feedTuners = useFeedTuners(feedDesc) const moderationOpts = useModerationOpts() const enabled = opts?.enabled !== false && Boolean(moderationOpts) - const lastRun = React.useRef<{ + const lastRun = useRef<{ data: InfiniteData args: typeof selectArgs result: InfiniteData } | null>(null) + const lastPageCountRef = useRef(0) // Make sure this doesn't invalidate unless really needed. const selectArgs = React.useMemo( @@ -152,6 +155,7 @@ export function usePostFeedQuery( api, cursor: res.cursor, feed: res.feed, + fetchedAt: Date.now(), } }, initialPageParam: undefined, @@ -214,6 +218,7 @@ export function usePostFeedQuery( api: page.api, tuner, cursor: page.cursor, + fetchedAt: page.fetchedAt, slices: tuner .tune(page.feed) .map(slice => { @@ -279,26 +284,28 @@ export function usePostFeedQuery( useEffect(() => { 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 numEmpties = 0 for (const page of data?.pages || []) { - if (page.slices.length === 0) { - numEmpties++ - } for (const slice of page.slices) { count += slice.items.length } } - - if ( - !isFetching && - hasNextPage && - count < PAGE_SIZE && - numEmpties < 3 && - (data?.pages.length || 0) < 6 - ) { + if (count < PAGE_SIZE && (data?.pages.length || 0) < 6) { query.fetchNextPage() + lastPageCountRef.current = data?.pages?.length || 0 } }, [query]) @@ -409,6 +416,9 @@ export function* findAllPostsInQueryData( } function assertSomePostsPassModeration(feed: AppBskyFeedDefs.FeedViewPost[]) { + // no posts in this feed + if (feed.length === 0) return true + // assume false let somePostsPassModeration = false diff --git a/src/state/queries/profile.ts b/src/state/queries/profile.ts index 5fd0b4e344..40ba0653c1 100644 --- a/src/state/queries/profile.ts +++ b/src/state/queries/profile.ts @@ -35,9 +35,7 @@ export function useProfileQuery({did}: {did: string | undefined}) { // if you remove it, the UI infinite-loops // -prf staleTime: isCurrentAccount ? STALE.SECONDS.THIRTY : STALE.MINUTES.FIVE, - refetchInterval: isCurrentAccount - ? STALE.SECONDS.THIRTY - : STALE.MINUTES.FIVE, + refetchInterval: STALE.MINUTES.FIVE, queryKey: RQKEY(did || ''), queryFn: async () => { const res = await getAgent().getProfile({actor: did || ''}) diff --git a/src/state/shell/logged-out.tsx b/src/state/shell/logged-out.tsx index a06a6d969f..8fe2a9c01f 100644 --- a/src/state/shell/logged-out.tsx +++ b/src/state/shell/logged-out.tsx @@ -22,7 +22,7 @@ type Controls = { /** * The did of the account to populate the login form with. */ - requestedAccount?: string + requestedAccount?: string | 'none' | 'new' }) => void /** * Clears the requested account so that next time the logged out view is diff --git a/src/view/com/auth/HomeLoggedOutCTA.tsx b/src/view/com/auth/HomeLoggedOutCTA.tsx new file mode 100644 index 0000000000..32b873ac67 --- /dev/null +++ b/src/view/com/auth/HomeLoggedOutCTA.tsx @@ -0,0 +1,165 @@ +import React from 'react' +import {StyleSheet, TouchableOpacity, View} from 'react-native' +import {useLingui} from '@lingui/react' +import {Trans, msg} from '@lingui/macro' +import {ScrollView} from '../util/Views' +import {Text} from '../util/text/Text' +import {usePalette} from '#/lib/hooks/usePalette' +import {colors, s} from '#/lib/styles' +import {TextLink} from '../util/Link' +import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' +import {useLoggedOutViewControls} from '#/state/shell/logged-out' + +export function HomeLoggedOutCTA() { + const pal = usePalette('default') + const {_} = useLingui() + const {isMobile} = useWebMediaQueries() + const {requestSwitchToAccount} = useLoggedOutViewControls() + + const showCreateAccount = React.useCallback(() => { + requestSwitchToAccount({requestedAccount: 'new'}) + }, [requestSwitchToAccount]) + + const showSignIn = React.useCallback(() => { + requestSwitchToAccount({requestedAccount: 'none'}) + }, [requestSwitchToAccount]) + + return ( + + + + Bluesky + + + See what's next + + + + + + Create a new account + + + + + Sign In + + + + + + + + + + + ) +} + +const styles = StyleSheet.create({ + container: { + height: '100%', + }, + hero: { + justifyContent: 'center', + paddingTop: 100, + paddingBottom: 30, + }, + heroMobile: { + paddingBottom: 50, + }, + title: { + textAlign: 'center', + fontSize: 68, + fontWeight: 'bold', + }, + subtitle: { + textAlign: 'center', + fontSize: 48, + fontWeight: 'bold', + }, + subtitleMobile: { + fontSize: 42, + }, + btnsDesktop: { + flexDirection: 'row', + justifyContent: 'center', + gap: 20, + marginHorizontal: 20, + }, + btn: { + borderRadius: 32, + width: 230, + paddingVertical: 12, + marginBottom: 20, + }, + btnMobile: { + flex: 1, + width: 'auto', + marginHorizontal: 20, + paddingVertical: 16, + }, + btnLabel: { + textAlign: 'center', + fontSize: 18, + }, + btnLabelMobile: { + textAlign: 'center', + fontSize: 21, + }, + + footer: { + flexDirection: 'row', + gap: 20, + justifyContent: 'center', + }, + footerLink: {}, +}) diff --git a/src/view/com/auth/LoggedOut.tsx b/src/view/com/auth/LoggedOut.tsx index fcff4f7821..b0b2bf7edc 100644 --- a/src/view/com/auth/LoggedOut.tsx +++ b/src/view/com/auth/LoggedOut.tsx @@ -33,7 +33,9 @@ export function LoggedOut({onDismiss}: {onDismiss?: () => void}) { const {requestedAccountSwitchTo} = useLoggedOutView() const [screenState, setScreenState] = React.useState( requestedAccountSwitchTo - ? ScreenState.S_Login + ? requestedAccountSwitchTo === 'new' + ? ScreenState.S_CreateAccount + : ScreenState.S_Login : ScreenState.S_LoginOrCreateAccount, ) const {isMobile} = useWebMediaQueries() diff --git a/src/view/com/auth/SplashScreen.tsx b/src/view/com/auth/SplashScreen.tsx index d88627f65a..ffd07d945b 100644 --- a/src/view/com/auth/SplashScreen.tsx +++ b/src/view/com/auth/SplashScreen.tsx @@ -7,6 +7,8 @@ import {usePalette} from 'lib/hooks/usePalette' import {CenteredView} from '../util/Views' import {Trans, msg} from '@lingui/macro' import {useLingui} from '@lingui/react' +import {Logo} from '#/view/icons/Logo' +import {Logotype} from '#/view/icons/Logotype' export const SplashScreen = ({ onPressSignin, @@ -22,11 +24,14 @@ export const SplashScreen = ({ - - Bluesky - - - See what's next + + + + + + + + What's up? @@ -65,6 +70,7 @@ const styles = StyleSheet.create({ hero: { flex: 2, justifyContent: 'center', + alignItems: 'center', }, btns: { paddingBottom: 40, diff --git a/src/view/com/auth/SplashScreen.web.tsx b/src/view/com/auth/SplashScreen.web.tsx index 08cf701da6..1cc7b9146d 100644 --- a/src/view/com/auth/SplashScreen.web.tsx +++ b/src/view/com/auth/SplashScreen.web.tsx @@ -10,6 +10,8 @@ import {CenteredView} from '../util/Views' import {isWeb} from 'platform/detection' import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' import {Trans} from '@lingui/macro' +import {Logo} from '#/view/icons/Logo' +import {Logotype} from '#/view/icons/Logotype' export const SplashScreen = ({ onDismiss, @@ -55,14 +57,15 @@ export const SplashScreen = ({ styles.containerInner, isMobileWeb && styles.containerInnerMobile, pal.border, + {alignItems: 'center'}, ]}> - - Bluesky - - - See what's next - + + + + + + }) { ) } const useStyles = () => { - const {isTabletOrMobile} = useWebMediaQueries() - const isMobileWeb = isWeb && isTabletOrMobile return StyleSheet.create({ container: { height: '100%', @@ -161,8 +162,7 @@ const useStyles = () => { paddingBottom: 30, }, btns: { - flexDirection: isMobileWeb ? 'column' : 'row', - gap: 20, + gap: 10, justifyContent: 'center', paddingBottom: 40, }, diff --git a/src/view/com/composer/Composer.tsx b/src/view/com/composer/Composer.tsx index f510be0be5..c4453e0c3e 100644 --- a/src/view/com/composer/Composer.tsx +++ b/src/view/com/composer/Composer.tsx @@ -62,6 +62,7 @@ import {useProfileQuery} from '#/state/queries/profile' import {useComposerControls} from '#/state/shell/composer' import {emitPostCreated} from '#/state/events' import {ThreadgateSetting} from '#/state/queries/threadgate' +import {logger} from '#/logger' type Props = ComposerOpts export const ComposePost = observer(function ComposePost({ @@ -228,6 +229,11 @@ export const ComposePost = observer(function ComposePost({ }) ).uri } catch (e: any) { + logger.error(e, { + message: `Composer: create post failed`, + hasImages: gallery.size > 0, + }) + if (extLink) { setExtLink({ ...extLink, diff --git a/src/view/com/feeds/FeedPage.tsx b/src/view/com/feeds/FeedPage.tsx index 31ebc75a19..84d49e3b09 100644 --- a/src/view/com/feeds/FeedPage.tsx +++ b/src/view/com/feeds/FeedPage.tsx @@ -7,13 +7,15 @@ import {useNavigation} from '@react-navigation/native' import {useAnalytics} from 'lib/analytics/analytics' import {useQueryClient} from '@tanstack/react-query' import {RQKEY as FEED_RQKEY} from '#/state/queries/post-feed' -import {useOnMainScroll} from 'lib/hooks/useOnMainScroll' +import {MainScrollProvider} from '../util/MainScrollProvider' import {usePalette} from 'lib/hooks/usePalette' import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' +import {useSetMinimalShellMode} from '#/state/shell' import {FeedDescriptor, FeedParams} from '#/state/queries/post-feed' import {ComposeIcon2} from 'lib/icons' import {colors, s} from 'lib/styles' -import {FlatList, View, useWindowDimensions} from 'react-native' +import {View, useWindowDimensions} from 'react-native' +import {ListMethods} from '../util/List' import {Feed} from '../posts/Feed' import {TextLink} from '../util/Link' import {FAB} from '../util/fab/FAB' @@ -27,7 +29,7 @@ import {truncateAndInvalidate} from '#/state/queries/util' import {TabState, getTabState, getRootNavigation} from '#/lib/routes/helpers' import {isNative} from '#/platform/detection' -const POLL_FREQ = 30e3 // 30sec +const POLL_FREQ = 60e3 // 60sec export function FeedPage({ testID, @@ -51,10 +53,11 @@ export function FeedPage({ const {isDesktop} = useWebMediaQueries() const queryClient = useQueryClient() const {openComposer} = useComposerControls() - const [onMainScroll, isScrolledDown, resetMainScroll] = useOnMainScroll() + const [isScrolledDown, setIsScrolledDown] = React.useState(false) + const setMinimalShellMode = useSetMinimalShellMode() const {screen, track} = useAnalytics() const headerOffset = useHeaderOffset() - const scrollElRef = React.useRef(null) + const scrollElRef = React.useRef(null) const [hasNew, setHasNew] = React.useState(false) const scrollToTop = React.useCallback(() => { @@ -62,8 +65,8 @@ export function FeedPage({ animated: isNative, offset: -headerOffset, }) - resetMainScroll() - }, [headerOffset, resetMainScroll]) + setMinimalShellMode(false) + }, [headerOffset, setMinimalShellMode]) const onSoftReset = React.useCallback(() => { const isScreenFocused = @@ -164,21 +167,22 @@ export function FeedPage({ return ( - + + + {(isScrolledDown || hasNew) && ( | null> - onScroll?: OnScrollHandler - scrollEventThrottle?: number + scrollElRef: ListRef headerOffset: number enabled?: boolean style?: StyleProp @@ -50,16 +46,7 @@ export const ProfileFeedgens = React.forwardRef< SectionRef, ProfileFeedgensProps >(function ProfileFeedgensImpl( - { - did, - scrollElRef, - onScroll, - scrollEventThrottle, - headerOffset, - enabled, - style, - testID, - }, + {did, scrollElRef, headerOffset, enabled, style, testID}, ref, ) { const pal = usePalette('default') @@ -185,10 +172,9 @@ export const ProfileFeedgens = React.forwardRef< [error, refetch, onPressRetryLoadMore, pal, preferences], ) - const scrollHandler = useAnimatedScrollHandler(onScroll || {}) return ( - - scrollElRef?: MutableRefObject | null> - onScroll: OnScrollHandler + scrollElRef?: ListRef + onScrolledDownChange: (isScrolledDown: boolean) => void onPressTryAgain?: () => void renderHeader: () => JSX.Element renderEmptyState: () => JSX.Element testID?: string - scrollEventThrottle?: number headerOffset?: number desktopFixedHeightOffset?: number }) { @@ -209,10 +205,9 @@ export function ListMembers({ [isFetching], ) - const scrollHandler = useAnimatedScrollHandler(onScroll) return ( - {items.length > 0 && ( diff --git a/src/view/com/lists/ProfileLists.tsx b/src/view/com/lists/ProfileLists.tsx index 1bd9d188ff..e3d9bd0b43 100644 --- a/src/view/com/lists/ProfileLists.tsx +++ b/src/view/com/lists/ProfileLists.tsx @@ -1,4 +1,4 @@ -import React, {MutableRefObject} from 'react' +import React from 'react' import { Dimensions, RefreshControl, @@ -8,7 +8,7 @@ import { ViewStyle, } from 'react-native' import {useQueryClient} from '@tanstack/react-query' -import {FlatList} from '../util/Views' +import {List, ListRef} from '../util/List' import {ListCard} from './ListCard' import {ErrorMessage} from '../util/error/ErrorMessage' import {LoadMoreRetryBtn} from '../util/LoadMoreRetryBtn' @@ -16,11 +16,9 @@ import {Text} from '../util/text/Text' import {useAnalytics} from 'lib/analytics/analytics' import {usePalette} from 'lib/hooks/usePalette' import {useProfileListsQuery, RQKEY} from '#/state/queries/profile-lists' -import {OnScrollHandler} from '#/lib/hooks/useOnMainScroll' import {logger} from '#/logger' import {Trans} from '@lingui/macro' import {cleanError} from '#/lib/strings/errors' -import {useAnimatedScrollHandler} from '#/lib/hooks/useAnimatedScrollHandler_FIXED' import {useTheme} from '#/lib/ThemeContext' import {FeedLoadingPlaceholder} from '#/view/com/util/LoadingPlaceholder' import {isNative} from '#/platform/detection' @@ -36,9 +34,7 @@ interface SectionRef { interface ProfileListsProps { did: string - scrollElRef: MutableRefObject | null> - onScroll?: OnScrollHandler - scrollEventThrottle?: number + scrollElRef: ListRef headerOffset: number enabled?: boolean style?: StyleProp @@ -47,16 +43,7 @@ interface ProfileListsProps { export const ProfileLists = React.forwardRef( function ProfileListsImpl( - { - did, - scrollElRef, - onScroll, - scrollEventThrottle, - headerOffset, - enabled, - style, - testID, - }, + {did, scrollElRef, headerOffset, enabled, style, testID}, ref, ) { const pal = usePalette('default') @@ -187,10 +174,9 @@ export const ProfileLists = React.forwardRef( [error, refetch, onPressRetryLoadMore, pal], ) - const scrollHandler = useAnimatedScrollHandler(onScroll || {}) return ( - ( minHeight: Dimensions.get('window').height * 1.5, }} style={{paddingTop: headerOffset}} - onScroll={onScroll != null ? scrollHandler : undefined} - scrollEventThrottle={scrollEventThrottle} indicatorStyle={theme.colorScheme === 'dark' ? 'white' : 'black'} removeClippedSubviews={true} contentOffset={{x: 0, y: headerOffset * -1}} diff --git a/src/view/com/notifications/Feed.tsx b/src/view/com/notifications/Feed.tsx index 260c9bbd58..52d534c4fd 100644 --- a/src/view/com/notifications/Feed.tsx +++ b/src/view/com/notifications/Feed.tsx @@ -1,13 +1,11 @@ -import React, {MutableRefObject} from 'react' -import {CenteredView, FlatList} from '../util/Views' +import React from 'react' +import {CenteredView} from '../util/Views' import {ActivityIndicator, RefreshControl, StyleSheet, View} from 'react-native' import {FeedItem} from './FeedItem' import {NotificationFeedLoadingPlaceholder} from '../util/LoadingPlaceholder' import {ErrorMessage} from '../util/error/ErrorMessage' import {LoadMoreRetryBtn} from '../util/LoadMoreRetryBtn' import {EmptyState} from '../util/EmptyState' -import {OnScrollHandler} from 'lib/hooks/useOnMainScroll' -import {useAnimatedScrollHandler} from '#/lib/hooks/useAnimatedScrollHandler_FIXED' import {s} from 'lib/styles' import {usePalette} from 'lib/hooks/usePalette' import {useNotificationFeedQuery} from '#/state/queries/notifications/feed' @@ -15,6 +13,7 @@ import {useUnreadNotificationsApi} from '#/state/queries/notifications/unread' import {logger} from '#/logger' import {cleanError} from '#/lib/strings/errors' import {useModerationOpts} from '#/state/queries/preferences' +import {List, ListRef} from '../util/List' const EMPTY_FEED_ITEM = {_reactKey: '__empty__'} const LOAD_MORE_ERROR_ITEM = {_reactKey: '__load_more_error__'} @@ -23,12 +22,12 @@ const LOADING_ITEM = {_reactKey: '__loading__'} export function Feed({ scrollElRef, onPressTryAgain, - onScroll, + onScrolledDownChange, ListHeaderComponent, }: { - scrollElRef?: MutableRefObject | null> + scrollElRef?: ListRef onPressTryAgain?: () => void - onScroll?: OnScrollHandler + onScrolledDownChange: (isScrolledDown: boolean) => void ListHeaderComponent?: () => JSX.Element }) { const pal = usePalette('default') @@ -135,7 +134,6 @@ export function Feed({ [isFetchingNextPage], ) - const scrollHandler = useAnimatedScrollHandler(onScroll || {}) return ( {error && ( @@ -146,7 +144,7 @@ export function Feed({ /> )} - void}, ) { const pal = usePalette('default') - const {isSandbox, hasSession} = useSession() + const {hasSession} = useSession() const {_} = useLingui() const setDrawerOpen = useSetDrawerOpen() const navigation = useNavigation() const {feeds, hasPinnedCustom} = usePinnedFeedsInfos() - const brandBlue = useColorSchemeStyle(s.brandBlue, s.blue3) const {headerHeight} = useShellLayout() const {headerMinimalShellTransform} = useMinimalShellMode() const pinnedDisplayNames = hasSession ? feeds.map(f => f.displayName) : [] @@ -86,9 +83,9 @@ export function FeedsTabBar( /> - - {isSandbox ? 'SANDBOX' : 'Bluesky'} - + + + {hasSession && ( | ScrollView | null> + scrollElRef: React.MutableRefObject } export interface PagerWithHeaderProps { @@ -62,7 +58,6 @@ export const PagerWithHeader = React.forwardRef( const [currentPage, setCurrentPage] = React.useState(0) const [tabBarHeight, setTabBarHeight] = React.useState(0) const [headerOnlyHeight, setHeaderOnlyHeight] = React.useState(0) - const [isScrolledDown, setIsScrolledDown] = React.useState(false) const scrollY = useSharedValue(0) const headerHeight = headerOnlyHeight + tabBarHeight @@ -155,15 +150,7 @@ export const PagerWithHeader = React.forwardRef( if (!throttleTimeout.current) { throttleTimeout.current = setTimeout(() => { throttleTimeout.current = null - runOnUI(adjustScrollForOtherPages)() - - const nextIsScrolledDown = scrollY.value > SCROLLED_DOWN_LIMIT - if (isScrolledDown !== nextIsScrolledDown) { - React.startTransition(() => { - setIsScrolledDown(nextIsScrolledDown) - }) - } }, 80 /* Sync often enough you're unlikely to catch it unsynced */) } }) @@ -211,7 +198,6 @@ export const PagerWithHeader = React.forwardRef( index={i} isReady={isReady} isFocused={i === currentPage} - isScrolledDown={isScrolledDown} onScrollWorklet={i === currentPage ? onScrollWorklet : noop} registerRef={registerRef} renderTab={child} @@ -293,7 +279,6 @@ function PagerItem({ index, isReady, isFocused, - isScrolledDown, onScrollWorklet, renderTab, registerRef, @@ -302,7 +287,6 @@ function PagerItem({ index: number isFocused: boolean isReady: boolean - isScrolledDown: boolean registerRef: (scrollRef: AnimatedRef | null, atIndex: number) => void onScrollWorklet: (e: NativeScrollEvent) => void renderTab: ((props: PagerWithHeaderChildParams) => JSX.Element) | null @@ -316,24 +300,21 @@ function PagerItem({ } }, [scrollElRef, registerRef, index]) - const scrollHandler = React.useMemo( - () => ({onScroll: onScrollWorklet}), - [onScrollWorklet], - ) - if (!isReady || renderTab == null) { return null } - return renderTab({ - headerHeight, - isFocused, - isScrolledDown, - onScroll: scrollHandler, - scrollElRef: scrollElRef as React.MutableRefObject< - FlatList | ScrollView | null - >, - }) + return ( + + {renderTab({ + headerHeight, + isFocused, + scrollElRef: scrollElRef as React.MutableRefObject< + ListMethods | ScrollView | null + >, + })} + + ) } const styles = StyleSheet.create({ diff --git a/src/view/com/post-thread/PostLikedBy.tsx b/src/view/com/post-thread/PostLikedBy.tsx index 60afe1f9c6..245ba59e8c 100644 --- a/src/view/com/post-thread/PostLikedBy.tsx +++ b/src/view/com/post-thread/PostLikedBy.tsx @@ -1,7 +1,8 @@ import React, {useCallback, useMemo, useState} from 'react' import {ActivityIndicator, RefreshControl, StyleSheet, View} from 'react-native' import {AppBskyFeedGetLikes as GetLikes} from '@atproto/api' -import {CenteredView, FlatList} from '../util/Views' +import {CenteredView} from '../util/Views' +import {List} from '../util/List' import {ErrorMessage} from '../util/error/ErrorMessage' import {ProfileCardWithFollowBtn} from '../profile/ProfileCard' import {usePalette} from 'lib/hooks/usePalette' @@ -84,7 +85,7 @@ export function PostLikedBy({uri}: {uri: string}) { // loaded // = return ( - item.actor.did} refreshControl={ diff --git a/src/view/com/post-thread/PostRepostedBy.tsx b/src/view/com/post-thread/PostRepostedBy.tsx index 1162fec403..5cc0063885 100644 --- a/src/view/com/post-thread/PostRepostedBy.tsx +++ b/src/view/com/post-thread/PostRepostedBy.tsx @@ -1,7 +1,8 @@ import React, {useMemo, useCallback, useState} from 'react' import {ActivityIndicator, RefreshControl, StyleSheet, View} from 'react-native' import {AppBskyActorDefs as ActorDefs} from '@atproto/api' -import {CenteredView, FlatList} from '../util/Views' +import {CenteredView} from '../util/Views' +import {List} from '../util/List' import {ProfileCardWithFollowBtn} from '../profile/ProfileCard' import {ErrorMessage} from '../util/error/ErrorMessage' import {usePalette} from 'lib/hooks/usePalette' @@ -85,7 +86,7 @@ export function PostRepostedBy({uri}: {uri: string}) { // loaded // = return ( - item.did} refreshControl={ diff --git a/src/view/com/post-thread/PostThread.tsx b/src/view/com/post-thread/PostThread.tsx index 051bc7849f..9175508847 100644 --- a/src/view/com/post-thread/PostThread.tsx +++ b/src/view/com/post-thread/PostThread.tsx @@ -8,7 +8,8 @@ import { View, } from 'react-native' import {AppBskyFeedDefs} from '@atproto/api' -import {CenteredView, FlatList} from '../util/Views' +import {CenteredView} from '../util/Views' +import {List, ListMethods} from '../util/List' import { FontAwesomeIcon, FontAwesomeIconStyle, @@ -140,7 +141,7 @@ function PostThreadLoaded({ const {_} = useLingui() const pal = usePalette('default') const {isTablet, isDesktop} = useWebMediaQueries() - const ref = useRef(null) + const ref = useRef(null) const highlightedPostRef = useRef(null) const needsScrollAdjustment = useRef( !isNative || // web always uses scroll adjustment @@ -156,7 +157,9 @@ function PostThreadLoaded({ // construct content const posts = React.useMemo(() => { let arr = [TOP_COMPONENT].concat( - Array.from(flattenThreadSkeleton(sortThread(thread, threadViewPrefs))), + Array.from( + flattenThreadSkeleton(sortThread(thread, threadViewPrefs), hasSession), + ), ) if (arr.length > maxVisible) { arr = arr.slice(0, maxVisible).concat([LOAD_MORE]) @@ -165,7 +168,7 @@ function PostThreadLoaded({ arr.push(BOTTOM_COMPONENT) } return arr - }, [thread, maxVisible, threadViewPrefs]) + }, [thread, maxVisible, threadViewPrefs, hasSession]) /** * NOTE @@ -335,7 +338,7 @@ function PostThreadLoaded({ ) return ( - { if (node.type === 'post') { if (node.parent) { - yield* flattenThreadSkeleton(node.parent) + yield* flattenThreadSkeleton(node.parent, hasSession) } else if (node.ctx.isParentLoading) { yield PARENT_SPINNER } + if (!hasSession && node.ctx.depth > 0 && hasPwiOptOut(node)) { + return + } yield node if (node.ctx.isHighlightedPost && !node.post.viewer?.replyDisabled) { yield REPLY_PROMPT } if (node.replies?.length) { for (const reply of node.replies) { - yield* flattenThreadSkeleton(reply) + yield* flattenThreadSkeleton(reply, hasSession) } } else if (node.ctx.isChildLoading) { yield CHILD_SPINNER @@ -492,6 +499,10 @@ function* flattenThreadSkeleton( } } +function hasPwiOptOut(node: ThreadPost) { + return !!node.post.author.labels?.find(l => l.val === '!no-unauthenticated') +} + function hasBranchingReplies(node: ThreadNode) { if (node.type !== 'post') { return false diff --git a/src/view/com/post-thread/PostThreadItem.tsx b/src/view/com/post-thread/PostThreadItem.tsx index 8d12117071..e6adfc85b5 100644 --- a/src/view/com/post-thread/PostThreadItem.tsx +++ b/src/view/com/post-thread/PostThreadItem.tsx @@ -187,6 +187,9 @@ let PostThreadItemLoaded = ({ return makeProfileLink(post.author, 'post', urip.rkey, 'reposted-by') }, [post.uri, post.author]) 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( record?.text || '', @@ -351,7 +354,7 @@ let PostThreadItemLoaded = ({ includeMute style={styles.alert} /> - {post.author.did === currentAccount?.did ? ( + {post.author.did === currentAccount?.did && !isSelfLabeledPost ? ( enabled?: boolean pollInterval?: number - scrollElRef?: MutableRefObject | null> + scrollElRef?: ListRef onHasNew?: (v: boolean) => void - onScroll?: OnScrollHandler - scrollEventThrottle?: number + onScrolledDownChange?: (isScrolledDown: boolean) => void renderEmptyState: () => JSX.Element renderEndOfFeed?: () => JSX.Element testID?: string @@ -81,6 +81,7 @@ let Feed = ({ const {currentAccount} = useSession() const [isPTRing, setIsPTRing] = React.useState(false) const checkForNewRef = React.useRef<(() => void) | null>(null) + const lastFetchRef = React.useRef(Date.now()) const opts = React.useMemo( () => ({enabled, ignoreFilterFor}), @@ -98,6 +99,9 @@ let Feed = ({ fetchNextPage, } = usePostFeedQuery(feed, feedParams, opts) const isEmpty = !isFetching && !data?.pages[0]?.slices.length + if (data?.pages[0]) { + lastFetchRef.current = data?.pages[0].fetchedAt + } const checkForNew = React.useCallback(async () => { if (!data?.pages[0] || isFetching || !onHasNew || !enabled) { @@ -137,11 +141,21 @@ let Feed = ({ checkForNewRef.current = checkForNew }, [checkForNew]) React.useEffect(() => { - if (enabled && checkForNewRef.current) { - // check for new on enable (aka on focus) - checkForNewRef.current() + if (enabled) { + const timeSinceFirstLoad = Date.now() - lastFetchRef.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(() => { let cleanup1: () => void | undefined, cleanup2: () => void | undefined const subscription = AppState.addEventListener('change', nextAppState => { @@ -270,10 +284,9 @@ let Feed = ({ ) }, [isFetchingNextPage, shouldRenderEndOfFeed, renderEndOfFeed, headerOffset]) - const scrollHandler = useAnimatedScrollHandler(onScroll || {}) return ( - item.did} refreshControl={ diff --git a/src/view/com/profile/ProfileFollows.tsx b/src/view/com/profile/ProfileFollows.tsx index 890c13eb23..5265ee07ea 100644 --- a/src/view/com/profile/ProfileFollows.tsx +++ b/src/view/com/profile/ProfileFollows.tsx @@ -1,7 +1,8 @@ import React from 'react' import {ActivityIndicator, RefreshControl, StyleSheet, View} from 'react-native' import {AppBskyActorDefs as ActorDefs} from '@atproto/api' -import {CenteredView, FlatList} from '../util/Views' +import {CenteredView} from '../util/Views' +import {List} from '../util/List' import {ErrorMessage} from '../util/error/ErrorMessage' import {ProfileCardWithFollowBtn} from './ProfileCard' import {usePalette} from 'lib/hooks/usePalette' @@ -86,7 +87,7 @@ export function ProfileFollows({name}: {name: string}) { // loaded // = return ( - item.did} refreshControl={ diff --git a/src/view/com/util/List.tsx b/src/view/com/util/List.tsx new file mode 100644 index 0000000000..5947fe87a1 --- /dev/null +++ b/src/view/com/util/List.tsx @@ -0,0 +1,64 @@ +import React, {memo, startTransition} from 'react' +import {FlatListProps} from 'react-native' +import {FlatList_INTERNAL} from './Views' +import {useScrollHandlers} from '#/lib/ScrollContext' +import {runOnJS, useSharedValue} from 'react-native-reanimated' +import {useAnimatedScrollHandler} from '#/lib/hooks/useAnimatedScrollHandler_FIXED' + +export type ListMethods = FlatList_INTERNAL +export type ListProps = Omit< + FlatListProps, + 'onScroll' // Use ScrollContext instead. +> & { + onScrolledDownChange?: (isScrolledDown: boolean) => void +} +export type ListRef = React.MutableRefObject + +const SCROLLED_DOWN_LIMIT = 200 + +function ListImpl( + {onScrolledDownChange, ...props}: ListProps, + ref: React.Ref, +) { + const isScrolledDown = useSharedValue(false) + const contextScrollHandlers = useScrollHandlers() + + function handleScrolledDownChange(didScrollDown: boolean) { + startTransition(() => { + onScrolledDownChange?.(didScrollDown) + }) + } + + const scrollHandler = useAnimatedScrollHandler({ + onBeginDrag(e, ctx) { + contextScrollHandlers.onBeginDrag?.(e, ctx) + }, + onEndDrag(e, ctx) { + contextScrollHandlers.onEndDrag?.(e, ctx) + }, + onScroll(e, ctx) { + contextScrollHandlers.onScroll?.(e, ctx) + + const didScrollDown = e.contentOffset.y > SCROLLED_DOWN_LIMIT + if (isScrolledDown.value !== didScrollDown) { + isScrolledDown.value = didScrollDown + if (onScrolledDownChange != null) { + runOnJS(handleScrolledDownChange)(didScrollDown) + } + } + }, + }) + + return ( + + ) +} + +export const List = memo(React.forwardRef(ListImpl)) as ( + props: ListProps & {ref?: React.Ref}, +) => React.ReactElement diff --git a/src/lib/hooks/useOnMainScroll.ts b/src/view/com/util/MainScrollProvider.tsx similarity index 69% rename from src/lib/hooks/useOnMainScroll.ts rename to src/view/com/util/MainScrollProvider.tsx index 2e7a799137..31a4ef0c85 100644 --- a/src/lib/hooks/useOnMainScroll.ts +++ b/src/view/com/util/MainScrollProvider.tsx @@ -1,30 +1,18 @@ -import {useState, useCallback, useMemo} from 'react' -import {NativeSyntheticEvent, NativeScrollEvent} from 'react-native' +import React, {useCallback} from 'react' +import {ScrollProvider} from '#/lib/ScrollContext' +import {NativeScrollEvent} from 'react-native' import {useSetMinimalShellMode, useMinimalShellMode} from '#/state/shell' import {useShellLayout} from '#/state/shell/shell-layout' -import {s} from 'lib/styles' import {isWeb} from 'platform/detection' -import { - useSharedValue, - interpolate, - runOnJS, - ScrollHandlers, -} from 'react-native-reanimated' +import {useSharedValue, interpolate} from 'react-native-reanimated' function clamp(num: number, min: number, max: number) { 'worklet' return Math.min(Math.max(num, min), max) } -export type OnScrollCb = ( - event: NativeSyntheticEvent, -) => void -export type OnScrollHandler = ScrollHandlers -export type ResetCb = () => void - -export function useOnMainScroll(): [OnScrollHandler, boolean, ResetCb] { +export function MainScrollProvider({children}: {children: React.ReactNode}) { const {headerHeight} = useShellLayout() - const [isScrolledDown, setIsScrolledDown] = useState(false) const mode = useMinimalShellMode() const setMode = useSetMinimalShellMode() const startDragOffset = useSharedValue(null) @@ -58,13 +46,6 @@ export function useOnMainScroll(): [OnScrollHandler, boolean, ResetCb] { const onScroll = useCallback( (e: NativeScrollEvent) => { 'worklet' - // Keep track of whether we want to show "scroll to top". - if (!isScrolledDown && e.contentOffset.y > s.window.height) { - runOnJS(setIsScrolledDown)(true) - } else if (isScrolledDown && e.contentOffset.y < s.window.height) { - runOnJS(setIsScrolledDown)(false) - } - if (startDragOffset.value === null || startMode.value === null) { if (mode.value !== 0 && e.contentOffset.y < headerHeight.value) { // If we're close enough to the top, always show the shell. @@ -102,24 +83,15 @@ export function useOnMainScroll(): [OnScrollHandler, boolean, ResetCb] { startMode.value = mode.value } }, - [headerHeight, mode, setMode, isScrolledDown, startDragOffset, startMode], + [headerHeight, mode, setMode, startDragOffset, startMode], ) - const scrollHandler: ScrollHandlers = useMemo( - () => ({ - onBeginDrag, - onEndDrag, - onScroll, - }), - [onBeginDrag, onEndDrag, onScroll], + return ( + + {children} + ) - - return [ - scrollHandler, - isScrolledDown, - useCallback(() => { - setIsScrolledDown(false) - setMode(false) - }, [setMode]), - ] } diff --git a/src/view/com/util/ViewSelector.tsx b/src/view/com/util/ViewSelector.tsx index 935d93033b..ee993c564d 100644 --- a/src/view/com/util/ViewSelector.tsx +++ b/src/view/com/util/ViewSelector.tsx @@ -1,13 +1,14 @@ import React, {useEffect, useState} from 'react' import { + NativeSyntheticEvent, + NativeScrollEvent, Pressable, RefreshControl, StyleSheet, View, ScrollView, } from 'react-native' -import {FlatList} from './Views' -import {OnScrollCb} from 'lib/hooks/useOnMainScroll' +import {FlatList_INTERNAL} from './Views' import {useColorSchemeStyle} from 'lib/hooks/useColorSchemeStyle' import {Text} from './text/Text' import {usePalette} from 'lib/hooks/usePalette' @@ -38,7 +39,7 @@ export const ViewSelector = React.forwardRef< | null | undefined onSelectView?: (viewIndex: number) => void - onScroll?: OnScrollCb + onScroll?: (event: NativeSyntheticEvent) => void onRefresh?: () => void onEndReached?: (info: {distanceFromEnd: number}) => void } @@ -59,7 +60,7 @@ export const ViewSelector = React.forwardRef< ) { const pal = usePalette('default') const [selectedIndex, setSelectedIndex] = useState(0) - const flatListRef = React.useRef(null) + const flatListRef = React.useRef(null) // events // = @@ -110,7 +111,7 @@ export const ViewSelector = React.forwardRef< [items], ) return ( - diff --git a/src/view/com/util/Views.web.tsx b/src/view/com/util/Views.web.tsx index 5a4f266fd5..db3b9de0d8 100644 --- a/src/view/com/util/Views.web.tsx +++ b/src/view/com/util/Views.web.tsx @@ -49,7 +49,7 @@ export function CenteredView({ return } -export const FlatList = React.forwardRef(function FlatListImpl( +export const FlatList_INTERNAL = React.forwardRef(function FlatListImpl( { contentContainerStyle, style, diff --git a/src/view/com/util/moderation/ContentHider.tsx b/src/view/com/util/moderation/ContentHider.tsx index b1ea76621b..1269b7ebf6 100644 --- a/src/view/com/util/moderation/ContentHider.tsx +++ b/src/view/com/util/moderation/ContentHider.tsx @@ -7,7 +7,7 @@ import {Text} from '../text/Text' import {ShieldExclamation} from 'lib/icons' import {describeModerationCause} from 'lib/moderation' import {useLingui} from '@lingui/react' -import {msg} from '@lingui/macro' +import {msg, Trans} from '@lingui/macro' import {useModalControls} from '#/state/modals' import {isPostMediaBlurred} from 'lib/moderation' @@ -95,13 +95,17 @@ export function ContentHider({ {desc.name} - {!moderation.noOverride && ( - - - {override ? 'Hide' : 'Show'} - - - )} + + + {moderation.noOverride ? ( + Learn more + ) : override ? ( + Hide + ) : ( + Show + )} + + {override && {children}} diff --git a/src/view/com/util/moderation/LabelInfo.tsx b/src/view/com/util/moderation/LabelInfo.tsx index 8fe3765c2b..970338752c 100644 --- a/src/view/com/util/moderation/LabelInfo.tsx +++ b/src/view/com/util/moderation/LabelInfo.tsx @@ -43,7 +43,8 @@ export function LabelInfo({ ]}> - This {'did' in details ? 'account' : 'post'} has been labeled. + A content warning has been applied to this{' '} + {'did' in details ? 'account' : 'post'}. {' '} + - Content Warning + {isNoPwi ? ( + Sign-in Required + ) : ( + Content Warning + )} - This {screenDescription} has been flagged: - - {desc.name}. - - { - openModal({ - name: 'moderation-details', - context: 'account', - moderation, - }) - }} - accessibilityRole="button" - accessibilityLabel={_(msg`Learn more about this warning`)} - accessibilityHint=""> - - Learn More - - + {isNoPwi ? ( + + This account has requested that users sign in to view their profile. + + ) : ( + <> + This {screenDescription} has been flagged: + + {desc.name}. + + { + openModal({ + name: 'moderation-details', + context: 'account', + moderation, + }) + }} + accessibilityRole="button" + accessibilityLabel={_(msg`Learn more about this warning`)} + accessibilityHint=""> + + Learn More + + + + )}{' '} {isMobile && } @@ -116,7 +134,7 @@ export function ScreenHider({ )} - + ) } diff --git a/src/view/com/util/post-ctrls/PostCtrls.tsx b/src/view/com/util/post-ctrls/PostCtrls.tsx index 83ea3e8c9f..414fb1e094 100644 --- a/src/view/com/util/post-ctrls/PostCtrls.tsx +++ b/src/view/com/util/post-ctrls/PostCtrls.tsx @@ -10,7 +10,7 @@ import {AppBskyFeedDefs, AppBskyFeedPost} from '@atproto/api' import {Text} from '../text/Text' import {PostDropdownBtn} from '../forms/PostDropdownBtn' 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 {useTheme} from 'lib/ThemeContext' import {RepostButton} from './RepostButton' @@ -180,7 +180,7 @@ let PostCtrls = ({ accessibilityHint="" hitSlop={big ? HITSLOP_20 : HITSLOP_10}> {post.viewer?.like ? ( - + ) : ( {post.likeCount} @@ -233,9 +233,6 @@ const styles = StyleSheet.create({ paddingLeft: 5, paddingRight: 5, }, - ctrlIconLiked: { - color: colors.like, - }, mt1: { marginTop: 1, }, diff --git a/src/view/icons/Logo.tsx b/src/view/icons/Logo.tsx new file mode 100644 index 0000000000..15ab5a11c0 --- /dev/null +++ b/src/view/icons/Logo.tsx @@ -0,0 +1,48 @@ +import React from 'react' +import Svg, { + Path, + Defs, + LinearGradient, + Stop, + SvgProps, + PathProps, +} from 'react-native-svg' + +import {colors} from '#/lib/styles' + +const ratio = 57 / 64 + +type Props = { + fill?: PathProps['fill'] +} & SvgProps + +export const Logo = React.forwardRef(function LogoImpl(props: Props, ref) { + const {fill, ...rest} = props + const gradient = fill === 'sky' + const _fill = gradient ? 'url(#sky)' : fill || colors.blue3 + // @ts-ignore it's fiiiiine + const size = parseInt(rest.width || 32) + return ( + + {gradient && ( + + + + + + + )} + + + + ) +}) diff --git a/src/view/icons/Logotype.tsx b/src/view/icons/Logotype.tsx new file mode 100644 index 0000000000..080c402fb3 --- /dev/null +++ b/src/view/icons/Logotype.tsx @@ -0,0 +1,29 @@ +import React from 'react' +import Svg, {Path, SvgProps, PathProps} from 'react-native-svg' + +import {usePalette} from '#/lib/hooks/usePalette' + +const ratio = 17 / 64 + +export function Logotype({ + fill, + ...rest +}: {fill?: PathProps['fill']} & SvgProps) { + const pal = usePalette('default') + // @ts-ignore it's fiiiiine + const size = parseInt(rest.width || 32) + + return ( + + + + ) +} diff --git a/src/view/icons.ts b/src/view/icons/index.tsx similarity index 100% rename from src/view/icons.ts rename to src/view/icons/index.tsx diff --git a/src/view/screens/Feeds.tsx b/src/view/screens/Feeds.tsx index f319fbc390..d2d0aafb8f 100644 --- a/src/view/screens/Feeds.tsx +++ b/src/view/screens/Feeds.tsx @@ -19,7 +19,7 @@ import { import {ErrorMessage} from 'view/com/util/error/ErrorMessage' import debounce from 'lodash.debounce' import {Text} from 'view/com/util/text/Text' -import {FlatList} from 'view/com/util/Views' +import {List} from 'view/com/util/List' import {useFocusEffect} from '@react-navigation/native' import {FeedSourceCard} from 'view/com/feeds/FeedSourceCard' import {Trans, msg} from '@lingui/macro' @@ -481,7 +481,7 @@ export function FeedsScreen(_props: Props) { {preferences ? : } - item.key} diff --git a/src/view/screens/Home.tsx b/src/view/screens/Home.tsx index 42a958b95d..bfe4402653 100644 --- a/src/view/screens/Home.tsx +++ b/src/view/screens/Home.tsx @@ -9,6 +9,7 @@ import {CustomFeedEmptyState} from 'view/com/posts/CustomFeedEmptyState' import {FeedsTabBar} from '../com/pager/FeedsTabBar' import {Pager, RenderTabBarFnProps} from 'view/com/pager/Pager' import {FeedPage} from 'view/com/feeds/FeedPage' +import {HomeLoggedOutCTA} from '../com/auth/HomeLoggedOutCTA' import {useSetMinimalShellMode, useSetDrawerSwipeDisabled} from '#/state/shell' import {usePreferencesQuery} from '#/state/queries/preferences' import {UsePreferencesQueryResponse} from '#/state/queries/preferences/types' @@ -199,12 +200,7 @@ function HomeScreenReady({ onPageScrollStateChanged={onPageScrollStateChanged} renderTabBar={renderTabBar} tabBarPosition="top"> - + ) } diff --git a/src/view/screens/Notifications.tsx b/src/view/screens/Notifications.tsx index fceaa60c29..e28a67e370 100644 --- a/src/view/screens/Notifications.tsx +++ b/src/view/screens/Notifications.tsx @@ -1,5 +1,5 @@ import React from 'react' -import {FlatList, View} from 'react-native' +import {View} from 'react-native' import {useFocusEffect} from '@react-navigation/native' import {useQueryClient} from '@tanstack/react-query' import { @@ -9,8 +9,9 @@ import { import {ViewHeader} from '../com/util/ViewHeader' import {Feed} from '../com/notifications/Feed' import {TextLink} from 'view/com/util/Link' +import {ListMethods} from 'view/com/util/List' import {LoadLatestBtn} from 'view/com/util/load-latest/LoadLatestBtn' -import {useOnMainScroll} from 'lib/hooks/useOnMainScroll' +import {MainScrollProvider} from '../com/util/MainScrollProvider' import {usePalette} from 'lib/hooks/usePalette' import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' import {s, colors} from 'lib/styles' @@ -35,8 +36,8 @@ type Props = NativeStackScreenProps< export function NotificationsScreen({}: Props) { const {_} = useLingui() const setMinimalShellMode = useSetMinimalShellMode() - const [onMainScroll, isScrolledDown, resetMainScroll] = useOnMainScroll() - const scrollElRef = React.useRef(null) + const [isScrolledDown, setIsScrolledDown] = React.useState(false) + const scrollElRef = React.useRef(null) const checkLatestRef = React.useRef<() => void | null>() const {screen} = useAnalytics() const pal = usePalette('default') @@ -50,8 +51,8 @@ export function NotificationsScreen({}: Props) { // = const scrollToTop = React.useCallback(() => { scrollElRef.current?.scrollToOffset({animated: isNative, offset: 0}) - resetMainScroll() - }, [scrollElRef, resetMainScroll]) + setMinimalShellMode(false) + }, [scrollElRef, setMinimalShellMode]) const onPressLoadLatest = React.useCallback(() => { scrollToTop() @@ -130,11 +131,13 @@ export function NotificationsScreen({}: Props) { return ( - + + + {(isScrolledDown || hasNew) && ( export function PostThreadScreen({route}: Props) { const queryClient = useQueryClient() const {_} = useLingui() + const {hasSession} = useSession() const {fabMinimalShellTransform} = useMinimalShellMode() const setMinimalShellMode = useSetMinimalShellMode() const {openComposer} = useComposerControls() @@ -89,7 +91,7 @@ export function PostThreadScreen({route}: Props) { /> )} - {isMobile && canReply && ( + {isMobile && canReply && hasSession && ( (() => { return [ @@ -277,103 +277,67 @@ function ProfileScreenLoaded({ onPageSelected={onPageSelected} onCurrentPageSelected={onCurrentPageSelected} renderHeader={renderHeader}> - {({onScroll, headerHeight, isFocused, isScrolledDown, scrollElRef}) => ( + {({headerHeight, isFocused, scrollElRef}) => ( | null> - } + scrollElRef={scrollElRef as ListRef} ignoreFilterFor={profile.did} /> )} {showRepliesTab - ? ({ - onScroll, - headerHeight, - isFocused, - isScrolledDown, - scrollElRef, - }) => ( + ? ({headerHeight, isFocused, scrollElRef}) => ( | null> - } + scrollElRef={scrollElRef as ListRef} ignoreFilterFor={profile.did} /> ) : null} - {({onScroll, headerHeight, isFocused, isScrolledDown, scrollElRef}) => ( + {({headerHeight, isFocused, scrollElRef}) => ( | null> - } + scrollElRef={scrollElRef as ListRef} ignoreFilterFor={profile.did} /> )} {showLikesTab - ? ({ - onScroll, - headerHeight, - isFocused, - isScrolledDown, - scrollElRef, - }) => ( + ? ({headerHeight, isFocused, scrollElRef}) => ( | null> - } + scrollElRef={scrollElRef as ListRef} ignoreFilterFor={profile.did} /> ) : null} {showFeedsTab - ? ({onScroll, headerHeight, isFocused, scrollElRef}) => ( + ? ({headerHeight, isFocused, scrollElRef}) => ( | null> - } - onScroll={onScroll} - scrollEventThrottle={1} + scrollElRef={scrollElRef as ListRef} headerOffset={headerHeight} enabled={isFocused} /> ) : null} {showListsTab - ? ({onScroll, headerHeight, isFocused, scrollElRef}) => ( + ? ({headerHeight, isFocused, scrollElRef}) => ( | null> - } - onScroll={onScroll} - scrollEventThrottle={1} + scrollElRef={scrollElRef as ListRef} headerOffset={headerHeight} enabled={isFocused} /> @@ -396,28 +360,19 @@ function ProfileScreenLoaded({ interface FeedSectionProps { feed: FeedDescriptor - onScroll: OnScrollHandler headerHeight: number isFocused: boolean - isScrolledDown: boolean - scrollElRef: React.MutableRefObject | null> + scrollElRef: ListRef ignoreFilterFor?: string } const FeedSection = React.forwardRef( function FeedSectionImpl( - { - feed, - onScroll, - headerHeight, - isFocused, - isScrolledDown, - scrollElRef, - ignoreFilterFor, - }, + {feed, headerHeight, isFocused, scrollElRef, ignoreFilterFor}, ref, ) { const queryClient = useQueryClient() const [hasNew, setHasNew] = React.useState(false) + const [isScrolledDown, setIsScrolledDown] = React.useState(false) const onScrollToTop = React.useCallback(() => { scrollElRef.current?.scrollToOffset({ @@ -443,8 +398,7 @@ const FeedSection = React.forwardRef( feed={feed} scrollElRef={scrollElRef} onHasNew={setHasNew} - onScroll={onScroll} - scrollEventThrottle={1} + onScrolledDownChange={setIsScrolledDown} renderEmptyState={renderPostsEmpty} headerOffset={headerHeight} renderEndOfFeed={ProfileEndOfFeed} diff --git a/src/view/screens/ProfileFeed.tsx b/src/view/screens/ProfileFeed.tsx index 620b1814af..cde39a33f4 100644 --- a/src/view/screens/ProfileFeed.tsx +++ b/src/view/screens/ProfileFeed.tsx @@ -1,25 +1,20 @@ import React, {useMemo, useCallback} from 'react' -import { - Dimensions, - StyleSheet, - View, - ActivityIndicator, - FlatList, -} from 'react-native' +import {Dimensions, StyleSheet, View, ActivityIndicator} from 'react-native' 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 {usePalette} from 'lib/hooks/usePalette' import {HeartIcon, HeartIconSolid} from 'lib/icons' import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' import {CommonNavigatorParams} from 'lib/routes/types' 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 {PagerWithHeader} from 'view/com/pager/PagerWithHeader' import {ProfileSubpageHeader} from 'view/com/profile/ProfileSubpageHeader' import {Feed} from 'view/com/posts/Feed' import {TextLink} from 'view/com/util/Link' +import {ListRef} from 'view/com/util/List' import {Button} from 'view/com/util/forms/Button' import {Text} from 'view/com/util/text/Text' import {RichText} from 'view/com/util/text/RichText' @@ -29,12 +24,13 @@ import {EmptyState} from 'view/com/util/EmptyState' import * as Toast from 'view/com/util/Toast' import {useSetTitle} from 'lib/hooks/useSetTitle' import {RQKEY as FEED_RQKEY} from '#/state/queries/post-feed' -import {OnScrollHandler} from 'lib/hooks/useOnMainScroll' import {shareUrl} from 'lib/sharing' import {toShareUrl} from 'lib/strings/url-helpers' import {Haptics} from 'lib/haptics' import {useAnalytics} from 'lib/analytics/analytics' import {NativeDropdown, DropdownItem} from 'view/com/util/forms/NativeDropdown' +import {useScrollHandlers} from '#/lib/ScrollContext' +import {useAnimatedScrollHandler} from '#/lib/hooks/useAnimatedScrollHandler_FIXED' import {makeCustomFeedLink} from 'lib/routes/links' import {pluralize} from 'lib/strings/helpers' import {CenteredView, ScrollView} from 'view/com/util/Views' @@ -46,12 +42,7 @@ import {logger} from '#/logger' import {Trans, msg} from '@lingui/macro' import {useLingui} from '@lingui/react' import {useModalControls} from '#/state/modals' -import {useAnimatedScrollHandler} from '#/lib/hooks/useAnimatedScrollHandler_FIXED' -import { - useFeedSourceInfoQuery, - FeedSourceFeedInfo, - useIsFeedPublicQuery, -} from '#/state/queries/feed' +import {useFeedSourceInfoQuery, FeedSourceFeedInfo} from '#/state/queries/feed' import {useResolveUriQuery} from '#/state/queries/resolve-uri' import { UsePreferencesQueryResponse, @@ -137,10 +128,8 @@ export function ProfileFeedScreen(props: Props) { function ProfileFeedScreenIntermediate({feedUri}: {feedUri: string}) { const {data: preferences} = usePreferencesQuery() const {data: info} = useFeedSourceInfoQuery({uri: feedUri}) - const {isLoading: isPublicStatusLoading, data: isPublicResponse} = - useIsFeedPublicQuery({uri: feedUri}) - if (!preferences || !info || isPublicStatusLoading) { + if (!preferences || !info) { return ( @@ -154,7 +143,6 @@ function ProfileFeedScreenIntermediate({feedUri}: {feedUri: string}) { ) } @@ -162,11 +150,9 @@ function ProfileFeedScreenIntermediate({feedUri}: {feedUri: string}) { export function ProfileFeedScreenInner({ preferences, feedInfo, - isPublicResponse, }: { preferences: UsePreferencesQueryResponse feedInfo: FeedSourceFeedInfo - isPublicResponse: ReturnType['data'] }) { const {_} = useLingui() const pal = usePalette('default') @@ -175,6 +161,7 @@ export function ProfileFeedScreenInner({ const {openComposer} = useComposerControls() const {track} = useAnalytics() const feedSectionRef = React.useRef(null) + const isScreenFocused = useIsFocused() const { mutateAsync: saveFeed, @@ -210,6 +197,9 @@ export function ProfileFeedScreenInner({ useSetTitle(feedInfo?.displayName) + // event handlers + // + const onToggleSaved = React.useCallback(async () => { try { Haptics.default() @@ -403,32 +393,21 @@ export function ProfileFeedScreenInner({ isHeaderReady={true} renderHeader={renderHeader} onCurrentPageSelected={onCurrentPageSelected}> - {({onScroll, headerHeight, isScrolledDown, scrollElRef, isFocused}) => - isPublicResponse?.isPublic ? ( - | null> - } - isFocused={isFocused} - /> - ) : ( - - - - ) - } - {({onScroll, headerHeight, scrollElRef}) => ( + {({headerHeight, scrollElRef, isFocused}) => ( + + )} + {({headerHeight, scrollElRef}) => ( } @@ -456,59 +435,16 @@ export function ProfileFeedScreenInner({ ) } -function NonPublicFeedMessage({rawError}: {rawError?: Error}) { - const pal = usePalette('default') - - return ( - - - - - Looks like this feed is only available to users with a Bluesky - account. Please sign up or sign in to view this feed! - - - - {rawError?.message && ( - - Message from server: {rawError.message} - - )} - - - ) -} - interface FeedSectionProps { feed: FeedDescriptor - onScroll: OnScrollHandler headerHeight: number - isScrolledDown: boolean - scrollElRef: React.MutableRefObject | null> + scrollElRef: ListRef isFocused: boolean } const FeedSection = React.forwardRef( - function FeedSectionImpl( - {feed, onScroll, headerHeight, isScrolledDown, scrollElRef, isFocused}, - ref, - ) { + function FeedSectionImpl({feed, headerHeight, scrollElRef, isFocused}, ref) { const [hasNew, setHasNew] = React.useState(false) + const [isScrolledDown, setIsScrolledDown] = React.useState(false) const queryClient = useQueryClient() const onScrollToTop = useCallback(() => { @@ -533,11 +469,10 @@ const FeedSection = React.forwardRef( @@ -558,7 +493,6 @@ function AboutSection({ feedRkey, feedInfo, headerHeight, - onScroll, scrollElRef, isOwner, }: { @@ -566,13 +500,13 @@ function AboutSection({ feedRkey: string feedInfo: FeedSourceFeedInfo headerHeight: number - onScroll: OnScrollHandler scrollElRef: React.MutableRefObject isOwner: boolean }) { const pal = usePalette('default') const {_} = useLingui() - const scrollHandler = useAnimatedScrollHandler(onScroll) + const scrollHandlers = useScrollHandlers() + const onScroll = useAnimatedScrollHandler(scrollHandlers) const [likeUri, setLikeUri] = React.useState(feedInfo.likeUri) const {hasSession} = useSession() const {track} = useAnalytics() @@ -608,12 +542,12 @@ function AboutSection({ return ( + }}> {isLiked ? ( - + ) : ( )} @@ -689,9 +623,6 @@ const styles = StyleSheet.create({ borderRadius: 50, marginLeft: 6, }, - liked: { - color: colors.red3, - }, notFoundContainer: { margin: 10, paddingHorizontal: 18, diff --git a/src/view/screens/ProfileList.tsx b/src/view/screens/ProfileList.tsx index 3dcc7121fd..2db768cc57 100644 --- a/src/view/screens/ProfileList.tsx +++ b/src/view/screens/ProfileList.tsx @@ -1,12 +1,6 @@ import React, {useCallback, useMemo} from 'react' -import { - ActivityIndicator, - FlatList, - Pressable, - StyleSheet, - View, -} from 'react-native' -import {useFocusEffect} from '@react-navigation/native' +import {ActivityIndicator, Pressable, StyleSheet, View} from 'react-native' +import {useFocusEffect, useIsFocused} from '@react-navigation/native' import {NativeStackScreenProps, CommonNavigatorParams} from 'lib/routes/types' import {useNavigation} from '@react-navigation/native' import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' @@ -22,6 +16,7 @@ import {EmptyState} from 'view/com/util/EmptyState' import {RichText} from 'view/com/util/text/RichText' import {Button} from 'view/com/util/forms/Button' import {TextLink} from 'view/com/util/Link' +import {ListRef} from 'view/com/util/List' import * as Toast from 'view/com/util/Toast' import {LoadLatestBtn} from 'view/com/util/load-latest/LoadLatestBtn' import {FAB} from 'view/com/util/fab/FAB' @@ -31,7 +26,6 @@ import {usePalette} from 'lib/hooks/usePalette' import {useSetTitle} from 'lib/hooks/useSetTitle' import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' import {RQKEY as FEED_RQKEY} from '#/state/queries/post-feed' -import {OnScrollHandler} from 'lib/hooks/useOnMainScroll' import {NavigationProp} from 'lib/routes/types' import {toShareUrl} from 'lib/strings/url-helpers' import {shareUrl} from 'lib/sharing' @@ -121,6 +115,7 @@ function ProfileListScreenLoaded({ const aboutSectionRef = React.useRef(null) const {openModal} = useModalControls() const isCurateList = list.purpose === 'app.bsky.graph.defs#curatelist' + const isScreenFocused = useIsFocused() useSetTitle(list.name) @@ -165,36 +160,22 @@ function ProfileListScreenLoaded({ isHeaderReady={true} renderHeader={renderHeader} onCurrentPageSelected={onCurrentPageSelected}> - {({ - onScroll, - headerHeight, - isScrolledDown, - scrollElRef, - isFocused, - }) => ( + {({headerHeight, scrollElRef, isFocused}) => ( | null> - } - onScroll={onScroll} + scrollElRef={scrollElRef as ListRef} headerHeight={headerHeight} - isScrolledDown={isScrolledDown} - isFocused={isFocused} + isFocused={isScreenFocused && isFocused} /> )} - {({onScroll, headerHeight, isScrolledDown, scrollElRef}) => ( + {({headerHeight, scrollElRef}) => ( | null> - } + scrollElRef={scrollElRef as ListRef} list={list} onPressAddUser={onPressAddUser} - onScroll={onScroll} headerHeight={headerHeight} - isScrolledDown={isScrolledDown} /> )} @@ -221,16 +202,12 @@ function ProfileListScreenLoaded({ items={SECTION_TITLES_MOD} isHeaderReady={true} renderHeader={renderHeader}> - {({onScroll, headerHeight, isScrolledDown, scrollElRef}) => ( + {({headerHeight, scrollElRef}) => ( | null> - } + scrollElRef={scrollElRef as ListRef} onPressAddUser={onPressAddUser} - onScroll={onScroll} headerHeight={headerHeight} - isScrolledDown={isScrolledDown} /> )} @@ -615,19 +592,15 @@ function Header({rkey, list}: {rkey: string; list: AppBskyGraphDefs.ListView}) { interface FeedSectionProps { feed: FeedDescriptor - onScroll: OnScrollHandler headerHeight: number - isScrolledDown: boolean - scrollElRef: React.MutableRefObject | null> + scrollElRef: ListRef isFocused: boolean } const FeedSection = React.forwardRef( - function FeedSectionImpl( - {feed, scrollElRef, onScroll, headerHeight, isScrolledDown, isFocused}, - ref, - ) { + function FeedSectionImpl({feed, scrollElRef, headerHeight, isFocused}, ref) { const queryClient = useQueryClient() const [hasNew, setHasNew] = React.useState(false) + const [isScrolledDown, setIsScrolledDown] = React.useState(false) const onScrollToTop = useCallback(() => { scrollElRef.current?.scrollToOffset({ @@ -651,11 +624,10 @@ const FeedSection = React.forwardRef( testID="listFeed" enabled={isFocused} feed={feed} - pollInterval={30e3} + pollInterval={60e3} scrollElRef={scrollElRef} onHasNew={setHasNew} - onScroll={onScroll} - scrollEventThrottle={1} + onScrolledDownChange={setIsScrolledDown} renderEmptyState={renderPostsEmpty} headerOffset={headerHeight} /> @@ -674,20 +646,19 @@ const FeedSection = React.forwardRef( interface AboutSectionProps { list: AppBskyGraphDefs.ListView onPressAddUser: () => void - onScroll: OnScrollHandler headerHeight: number - isScrolledDown: boolean - scrollElRef: React.MutableRefObject | null> + scrollElRef: ListRef } const AboutSection = React.forwardRef( function AboutSectionImpl( - {list, onPressAddUser, onScroll, headerHeight, isScrolledDown, scrollElRef}, + {list, onPressAddUser, headerHeight, scrollElRef}, ref, ) { const pal = usePalette('default') const {_} = useLingui() const {isMobile} = useWebMediaQueries() const {currentAccount} = useSession() + const [isScrolledDown, setIsScrolledDown] = React.useState(false) const isCurateList = list.purpose === 'app.bsky.graph.defs#curatelist' const isOwner = list.creator.did === currentAccount?.did @@ -817,8 +788,7 @@ const AboutSection = React.forwardRef( renderHeader={renderHeader} renderEmptyState={renderEmptyState} headerOffset={headerHeight} - onScroll={onScroll} - scrollEventThrottle={1} + onScrolledDownChange={setIsScrolledDown} /> {isScrolledDown && ( } keyExtractor={item => item.did} @@ -243,7 +244,7 @@ function SearchScreenPostResults({query}: {query: string}) { {isFetched ? ( <> {posts.length ? ( - { if (item.type === 'post') { @@ -284,7 +285,7 @@ function SearchScreenUserResults({query}: {query: string}) { return isFetched && results ? ( <> {results.length ? ( - ( @@ -303,7 +304,8 @@ function SearchScreenUserResults({query}: {query: string}) { ) } -const SECTIONS = ['Posts', 'Users'] +const SECTIONS_LOGGEDOUT = ['Users'] +const SECTIONS_LOGGEDIN = ['Posts', 'Users'] export function SearchScreenInner({query}: {query?: string}) { const pal = usePalette('default') const setMinimalShellMode = useSetMinimalShellMode() @@ -319,44 +321,62 @@ export function SearchScreenInner({query}: {query?: string}) { [setDrawerSwipeDisabled, setMinimalShellMode], ) + if (hasSession) { + return query ? ( + ( + + + + )} + initialPage={0}> + + + + + + + + ) : ( + + + + Suggested Follows + + + + + + ) + } + return query ? ( ( - + )} initialPage={0}> - - - - ) : hasSession ? ( - - - - Suggested Follows - - - - - ) : ( )} - - Search for posts and users. - + + + + {isDesktop ? ( + Find users with the search tool on the right + ) : ( + Find users on Bluesky + )} + + ) diff --git a/src/view/shell/Drawer.tsx b/src/view/shell/Drawer.tsx index 4d3a9531de..e5d2a38639 100644 --- a/src/view/shell/Drawer.tsx +++ b/src/view/shell/Drawer.tsx @@ -221,19 +221,17 @@ let DrawerContent = ({}: {}): React.ReactNode => { )} - {hasSession && } - {hasSession && } - - - {hasSession && ( - - )} - - {hasSession && ( + {hasSession ? ( <> + + + + + + { /> + ) : ( + )} diff --git a/src/view/shell/NavSignupCard.tsx b/src/view/shell/NavSignupCard.tsx index 11dd7ffee4..bae37e8380 100644 --- a/src/view/shell/NavSignupCard.tsx +++ b/src/view/shell/NavSignupCard.tsx @@ -5,22 +5,28 @@ import {useLingui} from '@lingui/react' import {s} from 'lib/styles' import {usePalette} from 'lib/hooks/usePalette' -import {DefaultAvatar} from '#/view/com/util/UserAvatar' import {Text} from '#/view/com/util/text/Text' import {Button} from '#/view/com/util/forms/Button' import {useLoggedOutViewControls} from '#/state/shell/logged-out' import {useCloseAllActiveElements} from '#/state/util' +import {Logo} from '#/view/icons/Logo' let NavSignupCard = ({}: {}): React.ReactNode => { const {_} = useLingui() const pal = usePalette('default') - const {setShowLoggedOut} = useLoggedOutViewControls() + const {requestSwitchToAccount} = useLoggedOutViewControls() const closeAllActiveElements = useCloseAllActiveElements() - const showLoggedOut = React.useCallback(() => { + const showSignIn = React.useCallback(() => { closeAllActiveElements() - setShowLoggedOut(true) - }, [setShowLoggedOut, closeAllActiveElements]) + requestSwitchToAccount({requestedAccount: 'none'}) + }, [requestSwitchToAccount, closeAllActiveElements]) + + const showCreateAccount = React.useCallback(() => { + closeAllActiveElements() + requestSwitchToAccount({requestedAccount: 'new'}) + // setShowLoggedOut(true) + }, [requestSwitchToAccount, closeAllActiveElements]) return ( { paddingTop: 6, marginBottom: 24, }}> - + - - + + Sign up or sign in to join the conversation + + + + + )} ) diff --git a/src/view/shell/bottom-bar/BottomBarWeb.tsx b/src/view/shell/bottom-bar/BottomBarWeb.tsx index 3a60bd3b1d..c5dc376b72 100644 --- a/src/view/shell/bottom-bar/BottomBarWeb.tsx +++ b/src/view/shell/bottom-bar/BottomBarWeb.tsx @@ -3,6 +3,9 @@ import {usePalette} from 'lib/hooks/usePalette' import {useNavigationState} from '@react-navigation/native' import Animated from 'react-native-reanimated' 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 {styles} from './BottomBarStyles' import {clamp} from 'lib/numbers' @@ -22,12 +25,33 @@ import {useMinimalShellMode} from 'lib/hooks/useMinimalShellMode' import {makeProfileLink} from 'lib/routes/links' import {CommonNavigatorParams} from 'lib/routes/types' 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() { + const {_} = useLingui() const {hasSession, currentAccount} = useSession() const pal = usePalette('default') const safeAreaInsets = useSafeAreaInsets() 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 ( - - {({isActive}) => { - const Icon = isActive ? HomeIconSolid : HomeIcon - return ( - - ) - }} - - - {({isActive}) => { - const Icon = isActive - ? MagnifyingGlassIcon2Solid - : MagnifyingGlassIcon2 - return ( - - ) - }} - - - {({isActive}) => { - return ( - - ) - }} - - - {hasSession && ( + {hasSession ? ( <> - + {({isActive}) => { - const Icon = isActive ? BellIconSolid : BellIcon + const Icon = isActive ? HomeIconSolid : HomeIcon return ( ) }} - + {({isActive}) => { - const Icon = isActive ? UserIconSolid : UserIcon + const Icon = isActive + ? MagnifyingGlassIcon2Solid + : MagnifyingGlassIcon2 return ( ) }} + + {hasSession && ( + <> + + {({isActive}) => { + return ( + + ) + }} + + + {({isActive}) => { + const Icon = isActive ? BellIconSolid : BellIcon + return ( + + ) + }} + + + {({isActive}) => { + const Icon = isActive ? UserIconSolid : UserIcon + return ( + + ) + }} + + + )} + + ) : ( + <> + + + + + + + + + + + + + + )} diff --git a/src/view/shell/desktop/LeftNav.tsx b/src/view/shell/desktop/LeftNav.tsx index e294431f31..df6cb64999 100644 --- a/src/view/shell/desktop/LeftNav.tsx +++ b/src/view/shell/desktop/LeftNav.tsx @@ -266,6 +266,10 @@ export function DesktopLeftNav() { const {isDesktop, isTablet} = useWebMediaQueries() const numUnread = useUnreadNotifications() + if (!hasSession && !isDesktop) { + return null + } + return ( ) : null} - - - } - iconFilled={ - - } - label={_(msg`Home`)} - /> - - } - iconFilled={ - - } - label={_(msg`Search`)} - /> - - } - iconFilled={ - - } - label={_(msg`Feeds`)} - /> - {hasSession && ( <> + + + } + iconFilled={ + + } + label={_(msg`Home`)} + /> + + } + iconFilled={ + + } + label={_(msg`Search`)} + /> + + } + iconFilled={ + + } + label={_(msg`Feeds`)} + /> } - label="Profile" + label={_(msg`Profile`)} /> ) : undefined} - + {hasSession && ( <> - - - - - - - + + + + + + ) } diff --git a/yarn.lock b/yarn.lock index e58cba1641..ab569ca5b8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -48,10 +48,10 @@ typed-emitter "^2.1.0" zod "^3.21.4" -"@atproto/api@^0.7.3": - version "0.7.3" - resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.7.3.tgz#3224000353619970d5e397a157c6e189e195ef47" - integrity sha512-fKU+W+S4kKxClE6IcPBHPZAjcyBYxG28S0FW/bv3T/ZYDkNxGzDV4xuoHOyEDGtB30slltl5U83njuuRZs5xtw== +"@atproto/api@^0.7.4": + version "0.7.4" + resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.7.4.tgz#0dd6e725c88d1f941c57670dc82b60fde10f4ec6" + integrity sha512-7DBy6/OcXemzCPzA0dx52LLYRABBs8bq9Docs3is+WRgEx5/Pd1kHSAlCHIaBhsym8fZ3/U4Fks/5FSHkSm4yQ== dependencies: "@atproto/common-web" "^0.2.3" "@atproto/lexicon" "^0.3.1" @@ -4448,6 +4448,11 @@ resolved "https://registry.yarnpkg.com/@react-native-community/eslint-plugin/-/eslint-plugin-1.3.0.tgz#9e558170c106bbafaa1ef502bd8e6d4651012bf9" integrity sha512-+zDZ20NUnSWghj7Ku5aFphMzuM9JulqCW+aPXT6IfIXFbb8tzYTTOSeRFOtuekJ99ibW2fUCSsjuKNlwDIbHFg== +"@react-native-masked-view/masked-view@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@react-native-masked-view/masked-view/-/masked-view-0.3.1.tgz#5bd76f17004a6ccbcec03856893777ee91f23d29" + integrity sha512-uVm8U6nwFIlUd1iDIB5cS+lDadApKR+l8k4k84d9hn+GN4lzAIJhUZ9syYX7c022MxNgAlbxoFLt0pqKoyaAGg== + "@react-native-menu/menu@^0.8.0": version "0.8.0" resolved "https://registry.yarnpkg.com/@react-native-menu/menu/-/menu-0.8.0.tgz#dbf227c2081e5ffd3d2073ee68ecc84cf8639727"