summaryrefslogtreecommitdiff
path: root/src/utils/seo/reviews-page.ts
diff options
context:
space:
mode:
authorrxliuli <rxliuli@gmail.com>2025-11-04 05:03:50 +0800
committerrxliuli <rxliuli@gmail.com>2025-11-04 05:03:50 +0800
commitbce557cc2dc767628bed6aac87301a1be7c5431b (patch)
treeb51a051228d01fe3306cd7626d4a96768aadb944 /src/utils/seo/reviews-page.ts
init commit
Diffstat (limited to 'src/utils/seo/reviews-page.ts')
-rw-r--r--src/utils/seo/reviews-page.ts56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/utils/seo/reviews-page.ts b/src/utils/seo/reviews-page.ts
new file mode 100644
index 0000000..041d7b8
--- /dev/null
+++ b/src/utils/seo/reviews-page.ts
@@ -0,0 +1,56 @@
+import type {
+ ReviewsPage,
+ ShelfBasedProductPage,
+} from '@jet-app/app-store/api/models';
+import type { SeoData } from '@amp/web-app-components/src/components/MetaTags/types';
+import type { AppStoreObjectGraph } from '@jet-app/app-store/foundation/runtime/app-store-object-graph';
+import type I18N from '@amp/web-apps-localization';
+
+import { truncateAroundLimit } from '~/utils/string-formatting';
+import { MAX_DESCRIPTION_LENGTH } from '~/utils/seo/common';
+import { isProductBadgeShelf } from '~/components/jet/shelf/ProductBadgeShelf.svelte';
+
+export function seoDataForReviewsPage(
+ i18n: I18N,
+ page: ReviewsPage,
+ productPage: ShelfBasedProductPage,
+ objectGraph: AppStoreObjectGraph,
+): SeoData {
+ const appName = productPage.lockup.title;
+ const artworkUrl = productPage.lockup.icon?.template;
+ const badgeShelf = Object.values(productPage.shelfMapping).find(
+ isProductBadgeShelf,
+ );
+ const developerName = badgeShelf?.items.find(
+ ({ key }) => key === 'developer',
+ )?.caption;
+
+ const title = i18n.t('ASE.Web.AppStore.Meta.TitleWithSiteName', {
+ title: i18n.t('ASE.Web.AppStore.Meta.Reviews.Title', {
+ appName,
+ }),
+ });
+
+ const descriptionLocKey = developerName
+ ? 'ASE.Web.AppStore.Meta.Product.Description'
+ : 'ASE.Web.AppStore.Meta.Product.DescriptionWithoutDeveloperName';
+
+ const description = truncateAroundLimit(
+ i18n.t(descriptionLocKey, {
+ appName,
+ developerName,
+ }),
+ MAX_DESCRIPTION_LENGTH,
+ objectGraph.locale.activeLanguage,
+ );
+
+ return {
+ artworkUrl,
+ pageTitle: title,
+ socialTitle: title,
+ appleTitle: title,
+ description,
+ socialDescription: description,
+ appleDescription: description,
+ };
+}