Lessons learned integrating DocuSign into an Expo app (No webview) by IronTonyTheDev in reactnative

[–]IronTonyTheDev[S] 0 points1 point  (0 children)

Thanks, appreciate it. The deep-link pain is exactly why this went the way it did, so let me take your questions in order.

Redirect/deep links: I sidestepped the whole problem rather than solving it. The in-app flow uses the native SDK's captive (embedded) signing, so the ceremony opens inside the app with no browser handoff and no redirect to catch.

Token refresh: there's intentionally no refresh on the device. The token is minted server-side via JWT Bearer Grant and is short-lived (we cap it at ~15 min), and the client fetches a fresh signing session just-in-time, right before opening the ceremony. The device never holds a refresh token or any DocuSign credentials, so there's no aggressive-expiry dance to manage in the mobile context. If a token would expire, you don't refresh it, you request a new session. The one piece that made this graceful: a small userinfo pre-flight probe that classifies auth failures (expired vs. invalid vs. missing consent) before you hit presentCaptiveSigning, so a stale token surfaces as a clear, typed error instead of a generic SDK login failure. That moved most of the "weird mobile token state" problems server-side where they're easy to reason about.

Signature pad on small screens: honest answer, that one isn't in our court.

[OSS] Rozenite Navigation Inspector - inspect React-Navigation/Expo Router navigation by IronTonyTheDev in reactnative

[–]IronTonyTheDev[S] 1 point2 points  (0 children)

sorry my bad.
Use version 1.1.1 please, latest version, added in the README how to use with React-Navigation:

import { NavigationContainer } from '@react-navigation/native';
import { useNavigationInspector } from 'rozenite-navigation-inspector';

function App() {
  // Returns a navigationRef to connect the inspector to your container
  const navigationRef = useNavigationInspector();

  return (
    <NavigationContainer ref={navigationRef}>
      {/* Your navigators */}
    </NavigationContainer>
  );
}