profile
viewpoint
Shane Brunson wsbrunson @paypal Chicago itsme.ws

wsbrunson/Quiz-Simply-React 12

The Simple JavaScript Quiz implemented in React

wsbrunson/angular-thumbnail 0

AngularJS thumbnail service to generate blob or base64 data as well as directive to display an image as thumbnail in canvas

wsbrunson/awesome-newsletters 0

A list of amazing Newsletters

wsbrunson/employee-directory 0

Find the awesome people you work with.

wsbrunson/eslint-config 0

opinonated eslint configs

PullRequestReviewEvent

Pull request review commentpaypal/paypal-smart-payment-buttons

feat(hcf): add analytics for vault setup token flows

 export const getCreateVaultSetupToken = ({   paymentSource: PaymentSource, |}): CreateVaultSetupToken => {   const data = buildXCreateVaultSetupTokenData({ paymentSource });-+  const startTime = Date.now();   return memoize(() => {     if (!createVaultSetupToken) {       throw new Error(`createVaultSetupToken undefined`);     } -    return createVaultSetupToken(data).then((vaultSetupToken) => {-      if (!vaultSetupToken || typeof vaultSetupToken !== "string") {-        throw new Error(-          `Expected a vault setup token to be returned from createVaultSetupToken`-        );-      }-      return vaultSetupToken;-    });+    return createVaultSetupToken(data)+      .then((vaultSetupToken) => {+        if (!vaultSetupToken || typeof vaultSetupToken !== "string") {+          const errString = "Expected a vault setup token to be returned from createVaultSetupToken"+          sendCountMetric({+            name: "pp.app.paypal_sdk.buttons.create_vault_setup_token.count",+            event: "error",+            dimensions: {+              errorName: 'no_setup_token',+            }+          })+          getLogger()+            .error('create_vault_setup_token', { err: errString })+            .track({+              [FPTI_KEY.STATE]:      FPTI_STATE.BUTTON,+              [FPTI_KEY.ERROR_CODE]: 'smart_buttons_create_vault_setup_token',+              [FPTI_KEY.ERROR_DESC]: errString+            })+          throw new Error(errString);+        }+        sendCountMetric({+          name: "pp.app.paypal_sdk.buttons.create_vault_setup_token.count",+          event: "success",+          dimensions: {+            errorName: "no_vault_setup_token"+          }+        });+        getLogger()+          .addTrackingBuilder(() => {+            return {+              [FPTI_KEY.STATE]: FPTI_STATE.BUTTON,+              [FPTI_KEY.TRANSITION]: FPTI_TRANSITION.RECEIVE_VAULT_SETUP_TOKEN,+              [FPTI_KEY.EVENT_NAME]: FPTI_TRANSITION.RECEIVE_VAULT_SETUP_TOKEN,+              [FPTI_KEY.CONTEXT_TYPE]: FPTI_CONTEXT_TYPE.VAULT_SETUP_TOKEN,+              [FPTI_KEY.CONTEXT_ID]: vaultSetupToken,+              [FPTI_CONTEXT_TYPE.VAULT_SETUP_TOKEN]: vaultSetupToken,+              [FPTI_KEY.RESPONSE_DURATION]: (Date.now() - startTime).toString(),+              client_time: getClientsideTimestamp(),+            };+          })
          .addTrackingBuilder(() => {
            return {
              [FPTI_KEY.CONTEXT_TYPE]: FPTI_CONTEXT_TYPE.VAULT_SETUP_TOKEN,
              [FPTI_KEY.CONTEXT_ID]: vaultSetupToken,
            };
          })
          .track({
              [FPTI_KEY.STATE]: FPTI_STATE.BUTTON,
              [FPTI_KEY.TRANSITION]: FPTI_TRANSITION.RECEIVE_VAULT_SETUP_TOKEN,
              [FPTI_KEY.EVENT_NAME]: FPTI_TRANSITION.RECEIVE_VAULT_SETUP_TOKEN,
              [FPTI_KEY.RESPONSE_DURATION]: (Date.now() - startTime).toString(),
              client_time: getClientsideTimestamp(),
          });

addTrackingBuilder will add tags for every subsequent call of track, but not actually fire a tracking event.

We add contextType and contextID to the tracking builder so that any event that fires after this one is properly marked as in the context of vault without purchase with the vault setup token

cgdibble

comment created time in 2 days

delete branch paypal/paypal-smart-payment-buttons

delete branch : revert-681-change-default-amount

delete time in 5 days

PR closed paypal/paypal-smart-payment-buttons

Optionally Revert "change default amount to remove decimals"

Reverts paypal/paypal-smart-payment-buttons#681

We can close this if we have a successful deploy today

+1 -1

2 comments

1 changed file

wsbrunson

pr closed time in 5 days

PR opened paypal/paypal-smart-payment-buttons

Optionally Revert "change default amount to remove decimals"

Reverts paypal/paypal-smart-payment-buttons#681

We can close this if we have a successful deploy today

+1 -1

0 comment

1 changed file

pr created time in 5 days

PullRequestReviewEvent
PullRequestReviewEvent

Pull request review commentpaypal/paypal-smart-payment-buttons

add logs for vault setup token received

 export const getCreateVaultSetupToken = ({   paymentSource: PaymentSource, |}): CreateVaultSetupToken => {   const data = buildXCreateVaultSetupTokenData({ paymentSource });-+  const startTime = Date.now();   return memoize(() => {     if (!createVaultSetupToken) {       throw new Error(`createVaultSetupToken undefined`);     } -    return createVaultSetupToken(data).then((vaultSetupToken) => {-      if (!vaultSetupToken || typeof vaultSetupToken !== "string") {-        throw new Error(-          `Expected a vault setup token to be returned from createVaultSetupToken`-        );-      }-      return vaultSetupToken;-    });+    return createVaultSetupToken(data)+      .then((vaultSetupToken) => {+        if (!vaultSetupToken || typeof vaultSetupToken !== "string") {+          const errString = "Expected a vault setup token to be returned from createVaultSetupToken"+          sendCountMetric({+            name: "pp.app.paypal_sdk.buttons.create_vault_setup_token.count",+            event: "error",+            dimensions: {+              errorName: 'no_setup_token',+            }+          })+          getLogger()+            .error('create_vault_setup_token', { err: errString })+            .track({+              [FPTI_KEY.STATE]:      FPTI_STATE.BUTTON,+              [FPTI_KEY.ERROR_CODE]: 'smart_buttons_create_vault_setup_token',+              [FPTI_KEY.ERROR_DESC]: errString+            })+          throw new Error(errString);+        }+        sendCountMetric({+          name: "pp.app.paypal_sdk.buttons.create_vault_setup_token.count",+          event: "success",+        });+        getLogger()+          .addTrackingBuilder(() => {+            return {+              [FPTI_KEY.STATE]: FPTI_STATE.BUTTON,+              [FPTI_KEY.TRANSITION]: FPTI_TRANSITION.RECEIVE_VAULT_SETUP_TOKEN,+              [FPTI_KEY.EVENT_NAME]: FPTI_TRANSITION.RECEIVE_VAULT_SETUP_TOKEN,+              [FPTI_KEY.CONTEXT_TYPE]: FPTI_CONTEXT_TYPE.VAULT_SETUP_TOKEN,+              [FPTI_KEY.CONTEXT_ID]: vaultSetupToken,+              [FPTI_CONTEXT_TYPE.VAULT_SETUP_TOKEN]: vaultSetupToken,+              [FPTI_KEY.RESPONSE_DURATION]: (Date.now() - startTime).toString(),+              client_time: getClientsideTimestamp(),+            };+          }).flush()

Since this is a success, we can rely on a flush further in the flow

          })
cgdibble

comment created time in 6 days

PullRequestReviewEvent

Pull request review commentpaypal/paypal-smart-payment-buttons

add logs for vault setup token received

 export const getCreateVaultSetupToken = ({   paymentSource: PaymentSource, |}): CreateVaultSetupToken => {   const data = buildXCreateVaultSetupTokenData({ paymentSource });-+  const startTime = Date.now();   return memoize(() => {     if (!createVaultSetupToken) {       throw new Error(`createVaultSetupToken undefined`);     } -    return createVaultSetupToken(data).then((vaultSetupToken) => {-      if (!vaultSetupToken || typeof vaultSetupToken !== "string") {-        throw new Error(-          `Expected a vault setup token to be returned from createVaultSetupToken`-        );-      }-      return vaultSetupToken;-    });+    return createVaultSetupToken(data)+      .then((vaultSetupToken) => {+        if (!vaultSetupToken || typeof vaultSetupToken !== "string") {+          const errString = "Expected a vault setup token to be returned from createVaultSetupToken"+          sendCountMetric({+            name: "pp.app.paypal_sdk.buttons.create_vault_setup_token.count",+            event: "error",+            dimensions: {+              errorName: 'no_setup_token',+            }+          })+          getLogger()+            .error('create_vault_setup_token', { err: errString })+            .track({+              [FPTI_KEY.STATE]:      FPTI_STATE.BUTTON,+              [FPTI_KEY.ERROR_CODE]: 'smart_buttons_create_vault_setup_token',+              [FPTI_KEY.ERROR_DESC]: errString+            })+          throw new Error(errString);+        }+        sendCountMetric({+          name: "pp.app.paypal_sdk.buttons.create_vault_setup_token.count",+          event: "success",+        });+        getLogger()+          .addTrackingBuilder(() => {+            return {+              [FPTI_KEY.STATE]: FPTI_STATE.BUTTON,+              [FPTI_KEY.TRANSITION]: FPTI_TRANSITION.RECEIVE_VAULT_SETUP_TOKEN,+              [FPTI_KEY.EVENT_NAME]: FPTI_TRANSITION.RECEIVE_VAULT_SETUP_TOKEN,+              [FPTI_KEY.CONTEXT_TYPE]: FPTI_CONTEXT_TYPE.VAULT_SETUP_TOKEN,+              [FPTI_KEY.CONTEXT_ID]: vaultSetupToken,+              [FPTI_CONTEXT_TYPE.VAULT_SETUP_TOKEN]: vaultSetupToken,+              [FPTI_KEY.RESPONSE_DURATION]: (Date.now() - startTime).toString(),+              client_time: getClientsideTimestamp(),+            };+          }).flush()++        return vaultSetupToken;+      })+      .catch((err) => {+        sendCountMetric({+          name: "pp.app.paypal_sdk.buttons.create_vault_setup_token.count",+          dimensions: {+              errorName: 'generic',+          }+        })++        getLogger()+            .error('create_vault_setup_token_error', { err: stringifyErrorMessage(err) })+            .track({+                [FPTI_KEY.STATE]:      FPTI_STATE.BUTTON,+                [FPTI_KEY.ERROR_CODE]: 'smart_buttons_create_vault_setup_token_error',+                [FPTI_KEY.ERROR_DESC]: stringifyErrorMessage(err)+            });
            })
            .flush();
cgdibble

comment created time in 6 days

PullRequestReviewEvent
PullRequestReviewEvent

Pull request review commentpaypal/paypal-smart-payment-buttons

add logs for vault setup token received

 export const getCreateVaultSetupToken = ({   paymentSource: PaymentSource, |}): CreateVaultSetupToken => {   const data = buildXCreateVaultSetupTokenData({ paymentSource });-+  const startTime = Date.now();   return memoize(() => {     if (!createVaultSetupToken) {       throw new Error(`createVaultSetupToken undefined`);     } -    return createVaultSetupToken(data).then((vaultSetupToken) => {-      if (!vaultSetupToken || typeof vaultSetupToken !== "string") {-        throw new Error(-          `Expected a vault setup token to be returned from createVaultSetupToken`-        );-      }-      return vaultSetupToken;-    });+    return createVaultSetupToken(data)+      .then((vaultSetupToken) => {+        if (!vaultSetupToken || typeof vaultSetupToken !== "string") {+          const errString = "Expected a vault setup token to be returned from createVaultSetupToken"+          sendCountMetric({+            name: "pp.app.paypal_sdk.buttons.create_vault_setup_token.count",+            event: "error",+            dimensions: {+              errorName: 'no_setup_token',+            }+          })+          getLogger()+            .error('create_vault_setup_token', { err: errString })+            .track({+              [FPTI_KEY.STATE]:      FPTI_STATE.BUTTON,+              [FPTI_KEY.ERROR_CODE]: 'smart_buttons_create_vault_setup_token',+              [FPTI_KEY.ERROR_DESC]: errString+            })+          throw new Error(errString);+        }+        sendCountMetric({+          name: "pp.app.paypal_sdk.buttons.create_vault_setup_token.count",+          event: "success",+        });+        getLogger()+          .addTrackingBuilder(() => {+            return {+              [FPTI_KEY.STATE]: FPTI_STATE.BUTTON,+              [FPTI_KEY.TRANSITION]: FPTI_TRANSITION.RECEIVE_VAULT_SETUP_TOKEN,+              [FPTI_KEY.EVENT_NAME]: FPTI_TRANSITION.RECEIVE_VAULT_SETUP_TOKEN,+              [FPTI_KEY.CONTEXT_TYPE]: FPTI_CONTEXT_TYPE.VAULT_SETUP_TOKEN,+              [FPTI_KEY.CONTEXT_ID]: vaultSetupToken,+              [FPTI_CONTEXT_TYPE.VAULT_SETUP_TOKEN]: vaultSetupToken,+              [FPTI_KEY.RESPONSE_DURATION]: (Date.now() - startTime).toString(),+              client_time: getClientsideTimestamp(),+            };+          }).flush()++        return vaultSetupToken;+      })+      .catch((err) => {+        sendCountMetric({+          name: "pp.app.paypal_sdk.buttons.create_vault_setup_token.count",+          dimensions: {
          event: "error",
          dimensions: {
cgdibble

comment created time in 6 days

Pull request review commentpaypal/paypal-smart-payment-buttons

add logs for vault setup token received

 export const getCreateVaultSetupToken = ({   paymentSource: PaymentSource, |}): CreateVaultSetupToken => {   const data = buildXCreateVaultSetupTokenData({ paymentSource });-+  const startTime = Date.now();   return memoize(() => {     if (!createVaultSetupToken) {       throw new Error(`createVaultSetupToken undefined`);     }      return createVaultSetupToken(data).then((vaultSetupToken) => {

since we aren't logging an error in createOrder, I would add a catch statement to this chain:

return createVaultSetupToken(data)
  .then((vaultSetupToken) => ...)
  .catch(error => {
    // log/metric for the error

    // throw error so that the `createOrder` chain still works as it does today
    throw error
  })
cgdibble

comment created time in 6 days

PullRequestReviewEvent
PullRequestReviewEvent
PullRequestReviewEvent
PullRequestReviewEvent
PullRequestReviewEvent

Pull request review commentpaypal/paypal-sdk-client

Decode the sdk meta if url encoded meta is passed

 export function setupLogger() {     // https://www.paypal.com/us/gifts/     const isLoadedInFrame = isPayPalDomain() && window.xprops;     const sdkLoadTime =-      typeof loadTime === "number" ? loadTime.toString() : undefined;+      typeof loadTime === "number" ? Number(loadTime) : undefined;

isn't loadTime already a number in this case? since typeof loadtime === "numer" is true?

ravishekhar

comment created time in 9 days

PullRequestReviewEvent
PullRequestReviewEvent
PullRequestReviewEvent
PullRequestReviewEvent

delete branch paypal/paypal-smart-payment-buttons

delete branch : change-default-amount

delete time in 12 days

push eventpaypal/paypal-smart-payment-buttons

Shane Brunson

commit sha b27bb0855f6c5c7350e79e246d0aafbbabc8b767

change default amount to remove decimals (#681)

view details

push time in 12 days

PR merged paypal/paypal-smart-payment-buttons

change default amount to remove decimals

https://paypal.atlassian.net/browse/LI-18516

0.00 is not a valid amount for currencies like JPY which don't support decimals. Backend team has assured us this should still work for decimal currencies

+1 -1

2 comments

1 changed file

wsbrunson

pr closed time in 12 days

PR opened paypal/paypal-smart-payment-buttons

change default amount to remove decimals

https://paypal.atlassian.net/browse/LI-18516

0.00 is not a valid amount for currencies like JPY which don't support decimals. Backend team has assured us this should still work for decimal currencies

+1 -1

0 comment

1 changed file

pr created time in 12 days

create barnchpaypal/paypal-smart-payment-buttons

branch : change-default-amount

created branch time in 12 days

more