PageSourceSearch

https://www.oneskin.co/cdn/shop/t/642/assets/account-skio-client.js?v=150381086783971037911790199446

js oneskin.co collected 2026-10-02 04:30:24 UTC 18,266 bytes, 106 lines download raw bytes

1/*!
2 * Skio GraphQL client for account subscriptions and product media.
3 * Ported from frontend/scripts/lib/account-home-skio-client.js
4 */if(!window.OneSkinAccount)throw new Error("[account-skio-client] OneSkinAccount runtime is missing. Load account-runtime.js first.");const{ensureSkioStorefrontAuth,getShopifyCustomerContextFromDom,hydrateSkioStorefrontUserFromLocalStorage,reconcileSkioStorefrontSession}=window.OneSkinAccount.require("SkioSession","account-skio-client"),SHIP_NOW_ENABLED=!0,ACTIVE_SUBSCRIPTIONS_QUERY=`
5  query AccountHomeActiveSubscriptions($storefrontUserId: uuid, $limit: Int!) {
6    Subscriptions(
7      where: {
8        status: { _in: ["ACTIVE", "FAILED", "PAUSED"] }
9        storefrontUserId: { _eq: $storefrontUserId }
10      }
11      order_by: { nextBillingDate: asc }
12      limit: $limit
13    ) {
14      id
15      platformId
16      status
17      nextBillingDate
18      DeliveryPolicy {
19        interval
20        intervalCount
21      }
22      SubscriptionLines(where: { removedAt: { _is_null: true } }) {
23        id
24        quantity
25        priceWithoutDiscount
26        ProductVariant {
27          title
28          image
29          platformId
30          price
31          compareAtPrice
32          Product {
33            platformId
34            title
35            imageSrc
36          }
37        }
38      }
39    }
40  }
41`;function waitForSkio(timeoutMs=8e3,intervalMs=100){return new Promise(resolve=>{const isReady=()=>typeof window<"u"&&window.Skio&&typeof window.Skio.graphQLRequest=="function";if(isReady()){resolve(window.Skio);return}const start=Date.now(),timer=window.setInterval(()=>{isReady()?(window.clearInterval(timer),resolve(window.Skio)):Date.now()-start>=timeoutMs&&(window.clearInterval(timer),resolve(window.Skio||null))},intervalMs)})}async function waitForSkioStorefrontUser(timeoutMs=8e3,intervalMs=100){const skio=await waitForSkio(timeoutMs,intervalMs);if(!skio)return null;const hasUser=()=>skio.storefrontUser?.id?!0:hydrateSkioStorefrontUserFromLocalStorage(skio);if(hasUser())return skio;const start=Date.now();return new Promise(resolve=>{const timer=window.setInterval(()=>{(hasUser()||Date.now()-start>=timeoutMs)&&(window.clearInterval(timer),resolve(skio))},intervalMs)})}async function ensureReconciledSkioStorefrontUser(timeoutMs=8e3,intervalMs=100){let skio=await waitForSkio(timeoutMs,intervalMs);if(!skio)return null;hydrateSkioStorefrontUserFromLocalStorage(skio);const shopify=getShopifyCustomerContextFromDom(),hasShopifyCustomer=!!(shopify.customerId||shopify.email);let matched=await reconcileSkioStorefrontSession(skio);const hasSkioSession=!!(skio.storefrontUser?.id||skio.storefrontUser?.idToken);return hasShopifyCustomer&&(!hasSkioSession||!matched)&&(await ensureSkioStorefrontAuth(),hydrateSkioStorefrontUserFromLocalStorage(skio),skio=await waitForSkioStorefrontUser(timeoutMs,intervalMs)||skio,await reconcileSkioStorefrontSession(skio)),skio}let activeSubscriptionsFetchPromise=null;async function fetchActiveSubscriptions({limit=250}={}){return activeSubscriptionsFetchPromise||(activeSubscriptionsFetchPromise=fetchActiveSubscriptionsOnce({limit}).finally(()=>{activeSubscriptionsFetchPromise=null}),activeSubscriptionsFetchPromise)}async function fetchActiveSubscriptionsOnce({limit=250}={}){const skio=await ensureReconciledSkioStorefrontUser();if(!skio||typeof skio.graphQLRequest!="function")throw new Error("Skio storefront SDK is not available on this page.");const storefrontUserId=skio.storefrontUser?.id;if(!storefrontUserId)return[];const response=await skio.graphQLRequest({query:ACTIVE_SUBSCRIPTIONS_QUERY,variables:{storefrontUserId,limit}});if(response?.errors?.length){const message=response.errors.map(error=>error.message).join(" ");throw new Error(message||"Skio GraphQL returned errors.")}return response?.data?.Subscriptions||[]}const SHIP_NOW_MUTATION=`
42  mutation shipNow($input: ShipNowInput!) {
43    shipNow(input: $input) {
44      message
45      ok
46    }
47  }
48`;async function shipNow(subscriptionId){if(!SHIP_NOW_ENABLED)return console.log("[ship-now] STUB \u2014 would call shipNow({ subscriptionId: %s })",subscriptionId),console.log("[ship-now] Set SHIP_NOW_ENABLED = true in account-home-skio-client.js to enable."),null;const skio=await waitForSkio();if(!skio||typeof skio.graphQLRequest!="function")throw new Error("Skio storefront SDK is not available on this page.");const response=await skio.graphQLRequest({query:SHIP_NOW_MUTATION,variables:{input:{subscriptionId,caller:"account-home"}}});if(response?.errors?.length){const message=response.errors.map(e=>e.message).join(" ");throw new Error(message||"Skio shipNow returned errors.")}return response?.data?.shipNow||{}}const UPCOMING_SUBSCRIPTION_QUERY=`
49  query AccountHomeUpcomingSubscription($storefrontUserId: uuid) {
50    Subscriptions(
51      where: {
52        status: { _in: ["ACTIVE", "FAILED", "PAUSED"] }
53        storefrontUserId: { _eq: $storefrontUserId }
54      }
55      order_by: { nextBillingDate: asc }
56      limit: 1
57    ) {
58      id
59      status
60      nextBillingDate
61      DeliveryPolicy {
62        interval
63        intervalCount
64      }
65      BillingPolicy {
66        interval
67        intervalCount
68      }
69    }
70  }
71`,ADD_TO_SUBSCRIPTION_MUTATION=`
72  mutation storefrontEditSubscriptionLines($input: EditSubscriptionLinesInput!) {
73    editSubscriptionLines(input: $input) {
74      subscriptionId
75    }
76  }
77`,SKIO_PRODUCT_ELIGIBILITY_QUERY=`
78  query AccountHomeProductEligibility($where: Product_bool_exp) {
79    Products(where: $where) {
80      canUpsell
81      ProductVariants {
82        enableOneTimeUpsell
83        platformId
84        SellingPlanGroupResources(where: { SellingPlanGroup: { name: { _eq: "Subscription" } } }) {
85          SellingPlanGroup {
86            id
87          }
88        }
89      }
90    }
91  }
92`,SKIO_PRODUCT_MEDIA_QUERY=`
93  query AccountHomeProductMedia($platformIds: [String!]!) {
94    Products(where: { platformId: { _in: $platformIds } }) {
95      platformId
96      title
97      imageSrc
98      ProductVariants {
99        platformId
100        title
101        image
102      }
103    }
104  }
105`;function isPrepaidSubscription(subscription){const delivery=subscription?.DeliveryPolicy,billing=subscription?.BillingPolicy;return!delivery||!billing?!1:delivery.interval!==billing.interval||delivery.intervalCount!==billing.intervalCount}function toShopifyVariantGid(variantId){const numericId=String(variantId||"").replace(/\D/g,"");return numericId?`gid://shopify/ProductVariant/${numericId}`:""}function toShopifyProductGid(productId){if(!productId)return"";const s=String(productId);if(s.startsWith("gid://"))return s;const numericId=s.replace(/\D/g,"");return numericId?`gid://shopify/Product/${numericId}`:""}function toShopifyOrderGid(orderId){if(!orderId)return"";const s=String(orderId);if(s.startsWith("gid://"))return s;const numericId=s.replace(/\D/g,"");return numericId?`gid://shopify/Order/${numericId}`:""}function toShopifyOrderPlatformId(orderId){if(!orderId)return"";const s=String(orderId);return s.startsWith("gid://")?(s.split("/").pop()||"").replace(/\D/g,""):s.replace(/\D/g,"")}function hasSkioStorefrontSession(storefrontUser){return!!(storefrontUser?.id||storefrontUser?.idToken)}async function resolveOneTimeToSubscriptionQuickActionUrl({orderPlatformId,stackId,path="/a/account/quick-action-v3"}){if(!orderPlatformId||!stackId)throw new Error("Missing required quick action parameters.");const skio=await ensureReconciledSkioStorefrontUser();if(!skio||typeof skio.graphQLRequest!="function")throw new Error("Skio storefront SDK is not available on this page.");if(!hasSkioStorefrontSession(skio.storefrontUser))throw new Error("Skio storefront user is not authenticated.");return buildOneTimeToSubscriptionQuickActionUrl({orderPlatformId,stackId,path})}function buildOneTimeToSubscriptionQuickActionUrl({orderPlatformId,stackId,path="/a/account/quick-action-v3"}){if(!orderPlatformId||!stackId)throw new Error("Missing required quick action parameters.");const url=new URL(path,window.location.origin);return url.searchParams.set("orderPlatformId",orderPlatformId),url.searchParams.set("stackId",stackId),url.toString()}async function fetchSkioProductEligibility(productId){const skio=await waitForSkio();if(!skio||typeof skio.graphQLRequest!="function")throw new Error("Skio storefront SDK is not available on this page.");const platformId=toShopifyProductGid(productId);if(!platformId)throw new Error(`Invalid productId for eligibility check: ${productId}`);const response=await skio.graphQLRequest({query:SKIO_PRODUCT_ELIGIBILITY_QUERY,variables:{where:{platformId:{_eq:platformId}}}});if(response?.errors?.length){const message=response.errors.map(e=>e.message).join(" ");throw new Error(message||"Skio product eligibility query returned errors.")}return response?.data?.Products?.[0]||null}const skioProductMediaCache=new Map,skioProductMediaQueuedIds=new Set;let skioProductMediaBatchPromise=null;async function fetchSkioProductMediaUncached(platformIds){const skio=await ensureReconciledSkioStorefrontUser();if(!skio||typeof skio.graphQLRequest!="function")throw new Error("Skio storefront SDK is not available on this page.");if(!hasSkioStorefrontSession(skio.storefrontUser))throw new Error("Skio storefront user is not authenticated.");const response=await skio.graphQLRequest({query:SKIO_PRODUCT_MEDIA_QUERY,variables:{platformIds}});if(response?.errors?.length){const message=response.errors.map(error=>error.message).join(" ");throw new Error(message||"Skio product media query returned errors.")}return response?.data?.Products||[]}function enqueueSkioProductMediaFetch(missingIds){return missingIds.forEach(id=>skioProductMediaQueuedIds.add(id)),skioProductMediaBatchPromise||(skioProductMediaBatchPromise=Promise.resolve().then(async()=>{const platformIds=[...skioProductMediaQueuedIds];if(skioProductMediaQueuedIds.clear(),!platformIds.length)return;const products=await fetchSkioProductMediaUncached(platformIds),found=new Set;
105(products||[]).forEach(product=>{const id=toShopifyProductGid(product.platformId);id&&(found.add(id),skioProductMediaCache.set(id,product))}),platformIds.forEach(id=>{found.has(id)||skioProductMediaCache.set(id,null)})}).finally(()=>{skioProductMediaBatchPromise=null})),skioProductMediaBatchPromise}async function fetchSkioProductMedia(productIds){const platformIds=[...new Set((productIds||[]).map(toShopifyProductGid).filter(Boolean))];if(!platformIds.length)return[];const missingIds=platformIds.filter(id=>!skioProductMediaCache.has(id));missingIds.length&&await enqueueSkioProductMediaFetch(missingIds);const stillMissing=platformIds.filter(id=>!skioProductMediaCache.has(id));return stillMissing.length&&await enqueueSkioProductMediaFetch(stillMissing),platformIds.map(id=>skioProductMediaCache.get(id)).filter(Boolean)}function getVariantEligibilityDetails(product,variantPlatformId){if(!product)return{addType:null,productFound:!1,variantFound:!1,canUpsell:!1,enableOneTimeUpsell:!1,sellingPlanCount:0,eligibleForSubscription:!1,eligibleForOneTimeUpsell:!1,ineligibleReason:"product_not_found_in_skio"};const variant=product.ProductVariants?.find(v=>v.platformId===variantPlatformId);if(!variant)return{addType:null,productFound:!0,variantFound:!1,canUpsell:!!product.canUpsell,enableOneTimeUpsell:!1,sellingPlanCount:0,eligibleForSubscription:!1,eligibleForOneTimeUpsell:!1,ineligibleReason:"variant_not_found_in_skio"};const sellingPlanCount=variant.SellingPlanGroupResources?.length??0,eligibleForSubscription=sellingPlanCount>0&&product.canUpsell,eligibleForOneTimeUpsell=variant.enableOneTimeUpsell&&product.canUpsell;let addType=null,ineligibleReason=null;if(eligibleForSubscription)addType="subscription";else if(eligibleForOneTimeUpsell)addType="one-time";else{const reasons=[];sellingPlanCount===0&&reasons.push("no_subscription_selling_plans"),product.canUpsell||reasons.push("product_can_upsell_disabled"),variant.enableOneTimeUpsell||reasons.push("one_time_upsell_disabled_on_variant"),ineligibleReason=reasons.join(", ")}return{addType,productFound:!0,variantFound:!0,canUpsell:!!product.canUpsell,enableOneTimeUpsell:!!variant.enableOneTimeUpsell,sellingPlanCount,eligibleForSubscription,eligibleForOneTimeUpsell,ineligibleReason}}function resolveVariantAddType(product,variantPlatformId){return getVariantEligibilityDetails(product,variantPlatformId).addType}async function fetchUpcomingSubscription(){const skio=await ensureReconciledSkioStorefrontUser();if(!skio||typeof skio.graphQLRequest!="function")throw new Error("Skio storefront SDK is not available on this page.");const storefrontUserId=skio.storefrontUser?.id;if(!storefrontUserId)return null;const response=await skio.graphQLRequest({query:UPCOMING_SUBSCRIPTION_QUERY,variables:{storefrontUserId}});if(response?.errors?.length){const message=response.errors.map(error=>error.message).join(" ");throw new Error(message||"Skio GraphQL returned errors.")}const subscription=response?.data?.Subscriptions?.[0]||null;return!subscription||isPrepaidSubscription(subscription)?null:subscription}const SUBSCRIPTION_ADD_SUPPORT_MESSAGE="Item was not added to subscription, please contact support";function createAddToSubscriptionMutationError(errors,fallbackMessage){const firstDetail=errors[0]?.extensions?.detail||"",message=errors.map(error=>error.message).join(" "),err=new Error(message||fallbackMessage);return firstDetail.toLowerCase().includes("not available through the customer portal")&&(err.code="PRODUCT_NOT_AVAILABLE_FOR_SUBSCRIPTION"),err}function createSubscriptionAddFailedError(message=SUBSCRIPTION_ADD_SUPPORT_MESSAGE){const err=new Error(message);return err.code="SUBSCRIPTION_ADD_FAILED",err}async function mutateAddToSubscriptionLine(skio,{subscriptionId,productVariantPlatformId,isOneTimeUpsell}){const response=await skio.graphQLRequest({query:ADD_TO_SUBSCRIPTION_MUTATION,variables:{input:{subscriptionId,subscriptionLinesToCreate:[{customAttributes:[{key:"add-to-subscription-component",value:"true"}],productVariantPlatformId,quantity:1,isOneTimeUpsell}]}}});if(response?.errors?.length)throw createAddToSubscriptionMutationError(response.errors,"Skio addToNextSubscription returned errors.");
105return response?.data?.editSubscriptionLines||{}}async function addToNextSubscription({subscriptionId,productVariantPlatformId,isOneTimeUpsell=!1,productId}){const skio=await waitForSkio();if(!skio||typeof skio.graphQLRequest!="function")throw new Error("Skio storefront SDK is not available on this page.");if(!subscriptionId||!productVariantPlatformId)throw new Error("Subscription id and product variant are required.");let eligibleForOneTimeUpsell=!1;if(productId)try{const product=await fetchSkioProductEligibility(productId),details=getVariantEligibilityDetails(product,productVariantPlatformId);if(eligibleForOneTimeUpsell=details.eligibleForOneTimeUpsell,!details.productFound||!details.variantFound)throw createSubscriptionAddFailedError()}catch(err){if(err.code==="SUBSCRIPTION_ADD_FAILED")throw err}const attempt=oneTime=>mutateAddToSubscriptionLine(skio,{subscriptionId,productVariantPlatformId,isOneTimeUpsell:oneTime});if(isOneTimeUpsell)try{return await attempt(!0)}catch(error){throw console.warn("[account-home-skio-client] addToNextSubscription one-time upsell failed",error),createSubscriptionAddFailedError()}try{return await attempt(!1)}catch(subscriptionError){if(!eligibleForOneTimeUpsell)throw console.warn("[account-home-skio-client] addToNextSubscription subscription add failed (no one-time fallback)",subscriptionError),createSubscriptionAddFailedError();try{return await attempt(!0)}catch(oneTimeError){throw console.warn("[account-home-skio-client] addToNextSubscription subscription and one-time upsell failed",{subscriptionError,oneTimeError}),createSubscriptionAddFailedError()}}}function extractNumericIdFromPlatformGid(platformId){if(!platformId)return"";const value=String(platformId);return value.startsWith("gid://")?value.split("/").pop()?.replace(/\D/g,"")||"":value.replace(/\D/g,"")}const variantProductIdCache=new Map;async function resolveShopifyProductIdFromSubscriptionLine(line){const fromSkio=extractNumericIdFromPlatformGid(line?.ProductVariant?.Product?.platformId);if(fromSkio)return fromSkio;const variantPlatformId=line?.ProductVariant?.platformId||"";return resolveShopifyProductIdFromVariantPlatformId(variantPlatformId)}async function resolveShopifyProductIdFromVariantPlatformId(variantPlatformId){const variantId=extractNumericIdFromPlatformGid(variantPlatformId);if(!variantId)return"";if(variantProductIdCache.has(variantId))return variantProductIdCache.get(variantId);try{const response=await fetch(`/variants/${variantId}.js`,{credentials:"same-origin"});if(!response.ok)return variantProductIdCache.set(variantId,""),"";const data=await response.json(),productId=data?.product_id?String(data.product_id):"";return variantProductIdCache.set(variantId,productId),productId}catch{return variantProductIdCache.set(variantId,""),""}}async function collectSubscriptionProductIds(subscription){const ids=[];for(const line of subscription?.SubscriptionLines||[]){const productId=await resolveShopifyProductIdFromSubscriptionLine(line);productId&&ids.push(productId)}return ids}async function fetchActiveOnlySubscriptionProductIds(){const activeSubscriptions=(await fetchActiveSubscriptions()).filter(subscription=>subscription.status==="ACTIVE");if(!activeSubscriptions.length)return[];const productIds=new Set;for(const subscription of activeSubscriptions)(await collectSubscriptionProductIds(subscription)).forEach(id=>productIds.add(id));return[...productIds]}window.OneSkinAccount.define("SkioClient",{waitForSkioStorefrontUser,fetchActiveSubscriptions,shipNow,resolveOneTimeToSubscriptionQuickActionUrl,fetchSkioProductEligibility,fetchSkioProductMedia,fetchUpcomingSubscription,addToNextSubscription,resolveShopifyProductIdFromSubscriptionLine,resolveShopifyProductIdFromVariantPlatformId,fetchActiveOnlySubscriptionProductIds,waitForSkio,toShopifyVariantGid,toShopifyProductGid,toShopifyOrderGid,toShopifyOrderPlatformId,buildOneTimeToSubscriptionQuickActionUrl,getVariantEligibilityDetails,resolveVariantAddType,extractNumericIdFromPlatformGid,SUBSCRIPTION_ADD_SUPPORT_MESSAGE});
106//# sourceMappingURL=/cdn/shop/t/642/assets/account-skio-client.js.map?v=150381086783971037911790199446

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.