@ya-accelerators/nextjs-framework 0.0.108 → 0.0.110

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,29 +1,47 @@
1
1
  'use client';
2
2
  import { useRouter } from 'next/navigation';
3
3
  import { signOut } from 'next-auth/react';
4
- import { useEffect, useRef } from 'react';
4
+ import { useEffect, useRef, useState } from 'react';
5
5
  import { useLoadingContext } from '../../../hooks/loading';
6
6
  import { deleteCookieValue, getAllCookieNames } from '../../../lib/cookie';
7
+ import { logger } from '../../../logger';
8
+ import { ErrorPage } from '../errorPage';
7
9
  export const SignOutForm = ({ replace }) => {
8
- const { showLoading } = useLoadingContext();
9
- useEffect(() => {
10
- showLoading();
11
- }, [showLoading]);
10
+ const { showLoading, dismissLoading } = useLoadingContext();
12
11
  const router = useRouter();
13
- const formRef = useRef(null);
14
- useEffect(() => {
15
- if (!formRef.current) {
12
+ const [failed, setFailed] = useState(false);
13
+ // LoadingProvider rebuilds showLoading / dismissLoading on every render of its own, and showLoading is
14
+ // what makes it render, so a callback closing over them changes identity on each run. The ref keeps the
15
+ // sign-out reachable from the retry without putting that identity in a dependency list, where it would
16
+ // re-fire the effect below and sign out in a loop.
17
+ const runRef = useRef(async () => { });
18
+ runRef.current = async () => {
19
+ showLoading();
20
+ const allCookieNames = await getAllCookieNames();
21
+ await Promise.all(allCookieNames.map((cookieName) => deleteCookieValue(cookieName)));
22
+ // The session cookie is httpOnly, so the loop above cannot reach it and this call is the only thing
23
+ // that ends the session. Navigating away on a failure would leave it live while the UI reports the
24
+ // user as signed out, so the failure is surfaced and the page stays put.
25
+ const failure = await signOut({ redirect: false }).then(() => undefined, (error) => error);
26
+ if (failure !== undefined) {
27
+ // The retry surface is put up before the record is written: the logger reads the client env on its
28
+ // first call, so a package missing NEXT_PUBLIC_DEPLOY_ENV throws here and would otherwise leave the
29
+ // page under the loading overlay with no way forward.
30
+ dismissLoading();
31
+ setFailed(true);
32
+ logger.error('auth', { error: failure });
16
33
  return;
17
34
  }
18
- formRef.current.requestSubmit();
35
+ setFailed(false);
36
+ router.refresh();
37
+ router.replace(replace === undefined ? '/' : replace);
38
+ };
39
+ useEffect(() => {
40
+ void runRef.current();
19
41
  }, []);
20
- return (<form ref={formRef} onSubmit={async (e) => {
21
- e.preventDefault();
22
- const allCookieNames = await getAllCookieNames();
23
- await Promise.all(allCookieNames.map((cookieName) => deleteCookieValue(cookieName)));
24
- await signOut({ redirect: false }).catch(() => undefined);
25
- router.refresh();
26
- router.replace(replace === undefined ? '/' : replace);
27
- }}/>);
42
+ if (failed) {
43
+ return <ErrorPage reset={() => void runRef.current()}/>;
44
+ }
45
+ return <></>;
28
46
  };
29
47
  //# sourceMappingURL=index.jsx.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.jsx","sourceRoot":"","sources":["../../../../../src/ui/functional/signOutForm/index.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAEzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAE1E,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAAE,OAAO,EAAwB,EAAE,EAAE;IAC/D,MAAM,EAAE,WAAW,EAAE,GAAG,iBAAiB,EAAE,CAAA;IAC3C,SAAS,CAAC,GAAG,EAAE;QACb,WAAW,EAAE,CAAA;IACf,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAA;IACjB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAC1B,MAAM,OAAO,GAAG,MAAM,CAAkB,IAAI,CAAC,CAAA;IAC7C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACrB,OAAM;QACR,CAAC;QACD,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,CAAA;IACjC,CAAC,EAAE,EAAE,CAAC,CAAA;IACN,OAAO,CACL,CAAC,IAAI,CACH,GAAG,CAAC,CAAC,OAAO,CAAC,CACb,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YACpB,CAAC,CAAC,cAAc,EAAE,CAAA;YAClB,MAAM,cAAc,GAAG,MAAM,iBAAiB,EAAE,CAAA;YAChD,MAAM,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;YACpF,MAAM,OAAO,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;YACzD,MAAM,CAAC,OAAO,EAAE,CAAA;YAChB,MAAM,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;QACvD,CAAC,CAAC,EACF,CACH,CAAA;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"index.jsx","sourceRoot":"","sources":["../../../../../src/ui/functional/signOutForm/index.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAC1E,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAExC,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAAE,OAAO,EAAwB,EAAE,EAAE;IAC/D,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,iBAAiB,EAAE,CAAA;IAC3D,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAC1B,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC3C,uGAAuG;IACvG,wGAAwG;IACxG,uGAAuG;IACvG,mDAAmD;IACnD,MAAM,MAAM,GAAG,MAAM,CAAsB,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,CAAA;IAC1D,MAAM,CAAC,OAAO,GAAG,KAAK,IAAI,EAAE;QAC1B,WAAW,EAAE,CAAA;QACb,MAAM,cAAc,GAAG,MAAM,iBAAiB,EAAE,CAAA;QAChD,MAAM,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;QACpF,oGAAoG;QACpG,mGAAmG;QACnG,yEAAyE;QACzE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CACrD,GAAG,EAAE,CAAC,SAAS,EACf,CAAC,KAAY,EAAE,EAAE,CAAC,KAAK,CACxB,CAAA;QACD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,mGAAmG;YACnG,oGAAoG;YACpG,sDAAsD;YACtD,cAAc,EAAE,CAAA;YAChB,SAAS,CAAC,IAAI,CAAC,CAAA;YACf,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;YACxC,OAAM;QACR,CAAC;QACD,SAAS,CAAC,KAAK,CAAC,CAAA;QAChB,MAAM,CAAC,OAAO,EAAE,CAAA;QAChB,MAAM,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;IACvD,CAAC,CAAA;IACD,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,MAAM,CAAC,OAAO,EAAE,CAAA;IACvB,CAAC,EAAE,EAAE,CAAC,CAAA;IACN,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,EAAG,CAAA;IAC1D,CAAC;IACD,OAAO,EAAE,GAAG,CAAA;AACd,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ya-accelerators/nextjs-framework",
3
- "version": "0.0.108",
3
+ "version": "0.0.110",
4
4
  "type": "module",
5
5
  "description": "",
6
6
  "author": "YA Technologies OÜ",