@os-team/profile 1.0.31 → 1.0.35

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.
Files changed (70) hide show
  1. package/dist/cjs/components/profile/ProfileConfigContext.js +1 -1
  2. package/dist/cjs/components/profile/ProfileContext.js +1 -1
  3. package/dist/cjs/components/profile/ProfileDrawer.js +1 -1
  4. package/dist/cjs/components/profile/ProfileUpdateNameModal.js +12 -9
  5. package/dist/cjs/components/profile/ProfileUpdateNameModal.js.map +1 -1
  6. package/dist/cjs/components/profile/ProfileUpdatePasswordModal.js +12 -9
  7. package/dist/cjs/components/profile/ProfileUpdatePasswordModal.js.map +1 -1
  8. package/dist/cjs/components/profile/ProtectedWrapper.js +28 -19
  9. package/dist/cjs/components/profile/ProtectedWrapper.js.map +1 -1
  10. package/dist/cjs/components/profile/UserAvatar.js +1 -1
  11. package/dist/cjs/components/profile/__generated__/ProfileDrawerUpdateAvatarMutation.graphql.js.map +1 -1
  12. package/dist/cjs/components/profile/__generated__/ProfileUpdateNameModalMutation.graphql.js.map +1 -1
  13. package/dist/cjs/components/session/SessionDrawer.js +1 -1
  14. package/dist/cjs/components/session/SessionDrawerContent.js +9 -7
  15. package/dist/cjs/components/session/SessionDrawerContent.js.map +1 -1
  16. package/dist/cjs/components/session/SessionList.js +22 -27
  17. package/dist/cjs/components/session/SessionList.js.map +1 -1
  18. package/dist/cjs/components/session/SessionListItem.js +6 -9
  19. package/dist/cjs/components/session/SessionListItem.js.map +1 -1
  20. package/dist/cjs/components/session/__generated__/SessionDrawerContentQuery.graphql.js +96 -165
  21. package/dist/cjs/components/session/__generated__/SessionDrawerContentQuery.graphql.js.map +1 -1
  22. package/dist/cjs/components/session/__generated__/SessionListItem_session.graphql.js.map +1 -1
  23. package/dist/cjs/components/session/__generated__/SessionListRefetchQuery.graphql.js +183 -0
  24. package/dist/cjs/components/session/__generated__/SessionListRefetchQuery.graphql.js.map +1 -0
  25. package/dist/cjs/components/session/__generated__/SessionList_sessions.graphql.js +29 -85
  26. package/dist/cjs/components/session/__generated__/SessionList_sessions.graphql.js.map +1 -1
  27. package/dist/cjs/index.js +1 -1
  28. package/dist/esm/components/profile/ProfileDrawer.js +9 -3
  29. package/dist/esm/components/profile/ProfileDrawer.js.map +1 -1
  30. package/dist/esm/components/profile/ProfileUpdateNameModal.js +10 -9
  31. package/dist/esm/components/profile/ProfileUpdateNameModal.js.map +1 -1
  32. package/dist/esm/components/profile/ProfileUpdatePasswordModal.js +10 -9
  33. package/dist/esm/components/profile/ProfileUpdatePasswordModal.js.map +1 -1
  34. package/dist/esm/components/profile/ProtectedWrapper.js +24 -25
  35. package/dist/esm/components/profile/ProtectedWrapper.js.map +1 -1
  36. package/dist/esm/components/profile/__generated__/ProfileDrawerUpdateAvatarMutation.graphql.js.map +1 -1
  37. package/dist/esm/components/profile/__generated__/ProfileUpdateNameModalMutation.graphql.js.map +1 -1
  38. package/dist/esm/components/session/SessionDrawerContent.js +7 -5
  39. package/dist/esm/components/session/SessionDrawerContent.js.map +1 -1
  40. package/dist/esm/components/session/SessionList.js +14 -14
  41. package/dist/esm/components/session/SessionList.js.map +1 -1
  42. package/dist/esm/components/session/SessionListItem.js +3 -4
  43. package/dist/esm/components/session/SessionListItem.js.map +1 -1
  44. package/dist/esm/components/session/__generated__/SessionDrawerContentQuery.graphql.js +96 -165
  45. package/dist/esm/components/session/__generated__/SessionDrawerContentQuery.graphql.js.map +1 -1
  46. package/dist/esm/components/session/__generated__/SessionListItem_session.graphql.js.map +1 -1
  47. package/dist/esm/components/session/__generated__/SessionListRefetchQuery.graphql.js +175 -0
  48. package/dist/esm/components/session/__generated__/SessionListRefetchQuery.graphql.js.map +1 -0
  49. package/dist/esm/components/session/__generated__/SessionList_sessions.graphql.js +26 -85
  50. package/dist/esm/components/session/__generated__/SessionList_sessions.graphql.js.map +1 -1
  51. package/dist/esm/components/shared/ErrorResult.js +3 -1
  52. package/dist/esm/components/shared/ErrorResult.js.map +1 -1
  53. package/dist/types/components/profile/ProfileUpdateNameModal.d.ts.map +1 -1
  54. package/dist/types/components/profile/ProfileUpdatePasswordModal.d.ts.map +1 -1
  55. package/dist/types/components/profile/ProtectedWrapper.d.ts.map +1 -1
  56. package/dist/types/components/profile/__generated__/ProfileDrawerUpdateAvatarMutation.graphql.d.ts +1 -1
  57. package/dist/types/components/profile/__generated__/ProfileDrawerUpdateAvatarMutation.graphql.d.ts.map +1 -1
  58. package/dist/types/components/profile/__generated__/ProfileUpdateNameModalMutation.graphql.d.ts +2 -2
  59. package/dist/types/components/profile/__generated__/ProfileUpdateNameModalMutation.graphql.d.ts.map +1 -1
  60. package/dist/types/components/session/SessionDrawerContent.d.ts.map +1 -1
  61. package/dist/types/components/session/SessionList.d.ts.map +1 -1
  62. package/dist/types/components/session/SessionListItem.d.ts.map +1 -1
  63. package/dist/types/components/session/__generated__/SessionDrawerContentQuery.graphql.d.ts.map +1 -1
  64. package/dist/types/components/session/__generated__/SessionListItem_session.graphql.d.ts +1 -1
  65. package/dist/types/components/session/__generated__/SessionListItem_session.graphql.d.ts.map +1 -1
  66. package/dist/types/components/session/__generated__/SessionListRefetchQuery.graphql.d.ts +13 -0
  67. package/dist/types/components/session/__generated__/SessionListRefetchQuery.graphql.d.ts.map +1 -0
  68. package/dist/types/components/session/__generated__/SessionList_sessions.graphql.d.ts +7 -11
  69. package/dist/types/components/session/__generated__/SessionList_sessions.graphql.d.ts.map +1 -1
  70. package/package.json +55 -55
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/lib/components/profile/__generated__/ProfileUpdateNameModalMutation.graphql.ts"],"names":["node","v0","v1","v2","v3","hash"],"mappings":"AAAA;;AACA;AACA;;AAwBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA,MAAMA,IAAqB,GAAI,YAAU;AACzC,MAAIC,EAAE,GAAG,CACP;AACE,oBAAgB,IADlB;AAEE,YAAQ,eAFV;AAGE,YAAQ;AAHV,GADO,CAAT;AAAA,MAOAC,EAAE,GAAG,CACH;AACE,YAAQ,UADV;AAEE,YAAQ,OAFV;AAGE,oBAAgB;AAHlB,GADG,CAPL;AAAA,MAcAC,EAAE,GAAG;AACH,aAAS,IADN;AAEH,YAAQ,IAFL;AAGH,YAAQ,aAHL;AAIH,YAAQ,WAJL;AAKH,kBAAc;AALX,GAdL;AAAA,MAqBAC,EAAE,GAAG;AACH,aAAS,IADN;AAEH,YAAQ,IAFL;AAGH,YAAQ,aAHL;AAIH,YAAQ,UAJL;AAKH,kBAAc;AALX,GArBL;AA4BA,SAAO;AACL,gBAAY;AACV,6BAAwBH;AAAE;AADhB;AAEV,cAAQ,UAFE;AAGV,kBAAY,IAHF;AAIV,cAAQ,gCAJE;AAKV,oBAAc,CACZ;AACE,iBAAS,IADX;AAEE,gBAASC;AAAE;AAFb;AAGE,wBAAgB,MAHlB;AAIE,gBAAQ,aAJV;AAKE,gBAAQ,eALV;AAME,kBAAU,KANZ;AAOE,sBAAc,CACXC;AAAE;AADS,UAEXC;AAAE;AAFS,SAPhB;AAWE,sBAAc;AAXhB,OADY,CALJ;AAoBV,cAAQ,UApBE;AAqBV,qBAAe;AArBL,KADP;AAwBL,YAAQ,SAxBH;AAyBL,iBAAa;AACX,6BAAwBH;AAAE;AADf;AAEX,cAAQ,WAFG;AAGX,cAAQ,gCAHG;AAIX,oBAAc,CACZ;AACE,iBAAS,IADX;AAEE,gBAASC;AAAE;AAFb;AAGE,wBAAgB,MAHlB;AAIE,gBAAQ,aAJV;AAKE,gBAAQ,eALV;AAME,kBAAU,KANZ;AAOE,sBAAc,CACXC;AAAE;AADS,UAEXC;AAAE;AAFS,UAGZ;AACE,mBAAS,IADX;AAEE,kBAAQ,IAFV;AAGE,kBAAQ,aAHV;AAIE,kBAAQ,IAJV;AAKE,wBAAc;AALhB,SAHY,CAPhB;AAkBE,sBAAc;AAlBhB,OADY;AAJH,KAzBR;AAoDL,cAAU;AACR,iBAAW,kCADH;AAER,YAAM,IAFE;AAGR,kBAAY,EAHJ;AAIR,cAAQ,gCAJA;AAKR,uBAAiB,UALT;AAMR,cAAQ;AANA;AApDL,GAAP;AA6DC,CA1F6B,EAA9B;;AA2FCJ,IAAD,CAAcK,IAAd,GAAqB,kCAArB;AACA,eAAeL,IAAf","sourcesContent":["/* tslint:disable */\n/* eslint-disable */\n// @ts-nocheck\n\nimport { ConcreteRequest } from \"relay-runtime\";\n\nexport type UpdateProfileInput = {\n firstName?: string | null;\n lastName?: string | null;\n};\nexport type ProfileUpdateNameModalMutationVariables = {\n input: UpdateProfileInput;\n};\nexport type ProfileUpdateNameModalMutationResponse = {\n readonly updateProfile: {\n readonly firstName: string | null;\n readonly lastName: string | null;\n };\n};\nexport type ProfileUpdateNameModalMutation = {\n readonly response: ProfileUpdateNameModalMutationResponse;\n readonly variables: ProfileUpdateNameModalMutationVariables;\n};\n\n\n\n/*\nmutation ProfileUpdateNameModalMutation(\n $input: UpdateProfileInput!\n) {\n updateProfile(input: $input) {\n firstName\n lastName\n id\n }\n}\n*/\n\nconst node: ConcreteRequest = (function(){\nvar v0 = [\n {\n \"defaultValue\": null,\n \"kind\": \"LocalArgument\",\n \"name\": \"input\"\n }\n],\nv1 = [\n {\n \"kind\": \"Variable\",\n \"name\": \"input\",\n \"variableName\": \"input\"\n }\n],\nv2 = {\n \"alias\": null,\n \"args\": null,\n \"kind\": \"ScalarField\",\n \"name\": \"firstName\",\n \"storageKey\": null\n},\nv3 = {\n \"alias\": null,\n \"args\": null,\n \"kind\": \"ScalarField\",\n \"name\": \"lastName\",\n \"storageKey\": null\n};\nreturn {\n \"fragment\": {\n \"argumentDefinitions\": (v0/*: any*/),\n \"kind\": \"Fragment\",\n \"metadata\": null,\n \"name\": \"ProfileUpdateNameModalMutation\",\n \"selections\": [\n {\n \"alias\": null,\n \"args\": (v1/*: any*/),\n \"concreteType\": \"User\",\n \"kind\": \"LinkedField\",\n \"name\": \"updateProfile\",\n \"plural\": false,\n \"selections\": [\n (v2/*: any*/),\n (v3/*: any*/)\n ],\n \"storageKey\": null\n }\n ],\n \"type\": \"Mutation\",\n \"abstractKey\": null\n },\n \"kind\": \"Request\",\n \"operation\": {\n \"argumentDefinitions\": (v0/*: any*/),\n \"kind\": \"Operation\",\n \"name\": \"ProfileUpdateNameModalMutation\",\n \"selections\": [\n {\n \"alias\": null,\n \"args\": (v1/*: any*/),\n \"concreteType\": \"User\",\n \"kind\": \"LinkedField\",\n \"name\": \"updateProfile\",\n \"plural\": false,\n \"selections\": [\n (v2/*: any*/),\n (v3/*: any*/),\n {\n \"alias\": null,\n \"args\": null,\n \"kind\": \"ScalarField\",\n \"name\": \"id\",\n \"storageKey\": null\n }\n ],\n \"storageKey\": null\n }\n ]\n },\n \"params\": {\n \"cacheID\": \"f70f0aaabf917dc446c3a71cf7b4f25f\",\n \"id\": null,\n \"metadata\": {},\n \"name\": \"ProfileUpdateNameModalMutation\",\n \"operationKind\": \"mutation\",\n \"text\": \"mutation ProfileUpdateNameModalMutation(\\n $input: UpdateProfileInput!\\n) {\\n updateProfile(input: $input) {\\n firstName\\n lastName\\n id\\n }\\n}\\n\"\n }\n};\n})();\n(node as any).hash = '7264a05b6738d5417df9f1dc462486aa';\nexport default node;\n"],"file":"ProfileUpdateNameModalMutation.graphql.js"}
1
+ {"version":3,"sources":["../../../../../src/lib/components/profile/__generated__/ProfileUpdateNameModalMutation.graphql.ts"],"names":["node","v0","v1","v2","v3","hash"],"mappings":"AAAA;;AACA;AACA;;AAwBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA,MAAMA,IAAqB,GAAI,YAAU;AACzC,MAAIC,EAAE,GAAG,CACP;AACE,oBAAgB,IADlB;AAEE,YAAQ,eAFV;AAGE,YAAQ;AAHV,GADO,CAAT;AAAA,MAOAC,EAAE,GAAG,CACH;AACE,YAAQ,UADV;AAEE,YAAQ,OAFV;AAGE,oBAAgB;AAHlB,GADG,CAPL;AAAA,MAcAC,EAAE,GAAG;AACH,aAAS,IADN;AAEH,YAAQ,IAFL;AAGH,YAAQ,aAHL;AAIH,YAAQ,WAJL;AAKH,kBAAc;AALX,GAdL;AAAA,MAqBAC,EAAE,GAAG;AACH,aAAS,IADN;AAEH,YAAQ,IAFL;AAGH,YAAQ,aAHL;AAIH,YAAQ,UAJL;AAKH,kBAAc;AALX,GArBL;AA4BA,SAAO;AACL,gBAAY;AACV,6BAAwBH;AAAE;AADhB;AAEV,cAAQ,UAFE;AAGV,kBAAY,IAHF;AAIV,cAAQ,gCAJE;AAKV,oBAAc,CACZ;AACE,iBAAS,IADX;AAEE,gBAASC;AAAE;AAFb;AAGE,wBAAgB,MAHlB;AAIE,gBAAQ,aAJV;AAKE,gBAAQ,eALV;AAME,kBAAU,KANZ;AAOE,sBAAc,CACXC;AAAE;AADS,UAEXC;AAAE;AAFS,SAPhB;AAWE,sBAAc;AAXhB,OADY,CALJ;AAoBV,cAAQ,UApBE;AAqBV,qBAAe;AArBL,KADP;AAwBL,YAAQ,SAxBH;AAyBL,iBAAa;AACX,6BAAwBH;AAAE;AADf;AAEX,cAAQ,WAFG;AAGX,cAAQ,gCAHG;AAIX,oBAAc,CACZ;AACE,iBAAS,IADX;AAEE,gBAASC;AAAE;AAFb;AAGE,wBAAgB,MAHlB;AAIE,gBAAQ,aAJV;AAKE,gBAAQ,eALV;AAME,kBAAU,KANZ;AAOE,sBAAc,CACXC;AAAE;AADS,UAEXC;AAAE;AAFS,UAGZ;AACE,mBAAS,IADX;AAEE,kBAAQ,IAFV;AAGE,kBAAQ,aAHV;AAIE,kBAAQ,IAJV;AAKE,wBAAc;AALhB,SAHY,CAPhB;AAkBE,sBAAc;AAlBhB,OADY;AAJH,KAzBR;AAoDL,cAAU;AACR,iBAAW,kCADH;AAER,YAAM,IAFE;AAGR,kBAAY,EAHJ;AAIR,cAAQ,gCAJA;AAKR,uBAAiB,UALT;AAMR,cAAQ;AANA;AApDL,GAAP;AA6DC,CA1F6B,EAA9B;;AA2FCJ,IAAD,CAAcK,IAAd,GAAqB,kCAArB;AACA,eAAeL,IAAf","sourcesContent":["/* tslint:disable */\n/* eslint-disable */\n// @ts-nocheck\n\nimport { ConcreteRequest } from \"relay-runtime\";\n\nexport type UpdateProfileInput = {\n firstName?: string | null | undefined;\n lastName?: string | null | undefined;\n};\nexport type ProfileUpdateNameModalMutationVariables = {\n input: UpdateProfileInput;\n};\nexport type ProfileUpdateNameModalMutationResponse = {\n readonly updateProfile: {\n readonly firstName: string | null;\n readonly lastName: string | null;\n };\n};\nexport type ProfileUpdateNameModalMutation = {\n readonly response: ProfileUpdateNameModalMutationResponse;\n readonly variables: ProfileUpdateNameModalMutationVariables;\n};\n\n\n\n/*\nmutation ProfileUpdateNameModalMutation(\n $input: UpdateProfileInput!\n) {\n updateProfile(input: $input) {\n firstName\n lastName\n id\n }\n}\n*/\n\nconst node: ConcreteRequest = (function(){\nvar v0 = [\n {\n \"defaultValue\": null,\n \"kind\": \"LocalArgument\",\n \"name\": \"input\"\n }\n],\nv1 = [\n {\n \"kind\": \"Variable\",\n \"name\": \"input\",\n \"variableName\": \"input\"\n }\n],\nv2 = {\n \"alias\": null,\n \"args\": null,\n \"kind\": \"ScalarField\",\n \"name\": \"firstName\",\n \"storageKey\": null\n},\nv3 = {\n \"alias\": null,\n \"args\": null,\n \"kind\": \"ScalarField\",\n \"name\": \"lastName\",\n \"storageKey\": null\n};\nreturn {\n \"fragment\": {\n \"argumentDefinitions\": (v0/*: any*/),\n \"kind\": \"Fragment\",\n \"metadata\": null,\n \"name\": \"ProfileUpdateNameModalMutation\",\n \"selections\": [\n {\n \"alias\": null,\n \"args\": (v1/*: any*/),\n \"concreteType\": \"User\",\n \"kind\": \"LinkedField\",\n \"name\": \"updateProfile\",\n \"plural\": false,\n \"selections\": [\n (v2/*: any*/),\n (v3/*: any*/)\n ],\n \"storageKey\": null\n }\n ],\n \"type\": \"Mutation\",\n \"abstractKey\": null\n },\n \"kind\": \"Request\",\n \"operation\": {\n \"argumentDefinitions\": (v0/*: any*/),\n \"kind\": \"Operation\",\n \"name\": \"ProfileUpdateNameModalMutation\",\n \"selections\": [\n {\n \"alias\": null,\n \"args\": (v1/*: any*/),\n \"concreteType\": \"User\",\n \"kind\": \"LinkedField\",\n \"name\": \"updateProfile\",\n \"plural\": false,\n \"selections\": [\n (v2/*: any*/),\n (v3/*: any*/),\n {\n \"alias\": null,\n \"args\": null,\n \"kind\": \"ScalarField\",\n \"name\": \"id\",\n \"storageKey\": null\n }\n ],\n \"storageKey\": null\n }\n ]\n },\n \"params\": {\n \"cacheID\": \"f70f0aaabf917dc446c3a71cf7b4f25f\",\n \"id\": null,\n \"metadata\": {},\n \"name\": \"ProfileUpdateNameModalMutation\",\n \"operationKind\": \"mutation\",\n \"text\": \"mutation ProfileUpdateNameModalMutation(\\n $input: UpdateProfileInput!\\n) {\\n updateProfile(input: $input) {\\n firstName\\n lastName\\n id\\n }\\n}\\n\"\n }\n};\n})();\n(node as any).hash = '7264a05b6738d5417df9f1dc462486aa';\nexport default node;\n"],"file":"ProfileUpdateNameModalMutation.graphql.js"}
@@ -17,12 +17,14 @@ const SessionDrawerContentLoader = () => {
17
17
  });
18
18
  };
19
19
 
20
+ const errorFallback = ({
21
+ error
22
+ }) => /*#__PURE__*/React.createElement(ErrorResult, {
23
+ error: error
24
+ });
25
+
20
26
  const SessionDrawerContent = () => /*#__PURE__*/React.createElement(ErrorBoundary, {
21
- fallback: ({
22
- error
23
- }) => /*#__PURE__*/React.createElement(ErrorResult, {
24
- error: error
25
- })
27
+ fallback: errorFallback
26
28
  }, /*#__PURE__*/React.createElement(Suspense, {
27
29
  fallback: /*#__PURE__*/React.createElement(SessionListSkeleton, null)
28
30
  }, /*#__PURE__*/React.createElement(SessionDrawerContentLoader, null)));
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/components/session/SessionDrawerContent.tsx"],"names":["React","Suspense","useLazyLoadQuery","ErrorBoundary","ErrorResult","SessionList","SessionListSkeleton","SESSION_HORIZONTAL_PADDING","SessionDrawerContentLoader","props","fetchPolicy","SessionDrawerContent","error"],"mappings":";;AAAA,OAAOA,KAAP,IAAgBC,QAAhB,QAAgC,OAAhC;AACA,SAASC,gBAAT,QAAiC,mBAAjC;AACA,SAASC,aAAT,QAA8B,kBAA9B;AAEA,OAAOC,WAAP,MAAwB,uBAAxB;AACA,OAAOC,WAAP,MAAwB,eAAxB;AACA,OAAOC,mBAAP,MAAgC,uBAAhC;AAGA,OAAO,MAAMC,0BAA0B,GAAG,CAAnC;;AAEP,MAAMC,0BAAoC,GAAG,MAAM;AACjD,QAAMC,KAAK,GAAGP,gBAAgB,sdAM5B,EAN4B,EAO5B;AAAEQ,IAAAA,WAAW,EAAE;AAAf,GAP4B,CAA9B;AAUA,sBAAO,oBAAC,WAAD;AAAa,IAAA,WAAW,EAAED;AAA1B,IAAP;AACD,CAZD;;AAcA,MAAME,oBAA8B,GAAG,mBACrC,oBAAC,aAAD;AAAe,EAAA,QAAQ,EAAE,CAAC;AAAEC,IAAAA;AAAF,GAAD,kBAAe,oBAAC,WAAD;AAAa,IAAA,KAAK,EAAEA;AAApB;AAAxC,gBACE,oBAAC,QAAD;AAAU,EAAA,QAAQ,eAAE,oBAAC,mBAAD;AAApB,gBACE,oBAAC,0BAAD,OADF,CADF,CADF;;AAQA,eAAeD,oBAAf","sourcesContent":["import React, { Suspense } from 'react';\nimport { useLazyLoadQuery } from 'react-relay/hooks';\nimport { ErrorBoundary } from '@os-design/utils';\nimport graphql from 'babel-plugin-relay/macro';\nimport ErrorResult from '../shared/ErrorResult';\nimport SessionList from './SessionList';\nimport SessionListSkeleton from './SessionListSkeleton';\nimport { SessionDrawerContentQuery } from './__generated__/SessionDrawerContentQuery.graphql';\n\nexport const SESSION_HORIZONTAL_PADDING = 1;\n\nconst SessionDrawerContentLoader: React.FC = () => {\n const props = useLazyLoadQuery<SessionDrawerContentQuery>(\n graphql`\n query SessionDrawerContentQuery {\n ...SessionList_sessions\n }\n `,\n {},\n { fetchPolicy: 'network-only' }\n );\n\n return <SessionList sessionsKey={props} />;\n};\n\nconst SessionDrawerContent: React.FC = () => (\n <ErrorBoundary fallback={({ error }) => <ErrorResult error={error} />}>\n <Suspense fallback={<SessionListSkeleton />}>\n <SessionDrawerContentLoader />\n </Suspense>\n </ErrorBoundary>\n);\n\nexport default SessionDrawerContent;\n"],"file":"SessionDrawerContent.js"}
1
+ {"version":3,"sources":["../../../../src/lib/components/session/SessionDrawerContent.tsx"],"names":["React","Suspense","useLazyLoadQuery","ErrorBoundary","ErrorResult","SessionList","SessionListSkeleton","SESSION_HORIZONTAL_PADDING","SessionDrawerContentLoader","props","fetchPolicy","errorFallback","error","SessionDrawerContent"],"mappings":";;AAAA,OAAOA,KAAP,IAAgBC,QAAhB,QAAgC,OAAhC;AACA,SAASC,gBAAT,QAAiC,mBAAjC;AACA,SAASC,aAAT,QAA8B,kBAA9B;AAEA,OAAOC,WAAP,MAAwB,uBAAxB;AACA,OAAOC,WAAP,MAAwB,eAAxB;AACA,OAAOC,mBAAP,MAAgC,uBAAhC;AAGA,OAAO,MAAMC,0BAA0B,GAAG,CAAnC;;AAEP,MAAMC,0BAAoC,GAAG,MAAM;AACjD,QAAMC,KAAK,GAAGP,gBAAgB,sdAM5B,EAN4B,EAO5B;AAAEQ,IAAAA,WAAW,EAAE;AAAf,GAP4B,CAA9B;AAUA,sBAAO,oBAAC,WAAD;AAAa,IAAA,WAAW,EAAED;AAA1B,IAAP;AACD,CAZD;;AAcA,MAAME,aAAa,GAAG,CAAC;AAAEC,EAAAA;AAAF,CAAD,kBAAe,oBAAC,WAAD;AAAa,EAAA,KAAK,EAAEA;AAApB,EAArC;;AAEA,MAAMC,oBAA8B,GAAG,mBACrC,oBAAC,aAAD;AAAe,EAAA,QAAQ,EAAEF;AAAzB,gBACE,oBAAC,QAAD;AAAU,EAAA,QAAQ,eAAE,oBAAC,mBAAD;AAApB,gBACE,oBAAC,0BAAD,OADF,CADF,CADF;;AAQA,eAAeE,oBAAf","sourcesContent":["import React, { Suspense } from 'react';\nimport { useLazyLoadQuery } from 'react-relay/hooks';\nimport { ErrorBoundary } from '@os-design/utils';\nimport graphql from 'babel-plugin-relay/macro';\nimport ErrorResult from '../shared/ErrorResult';\nimport SessionList from './SessionList';\nimport SessionListSkeleton from './SessionListSkeleton';\nimport { SessionDrawerContentQuery } from './__generated__/SessionDrawerContentQuery.graphql';\n\nexport const SESSION_HORIZONTAL_PADDING = 1;\n\nconst SessionDrawerContentLoader: React.FC = () => {\n const props = useLazyLoadQuery<SessionDrawerContentQuery>(\n graphql`\n query SessionDrawerContentQuery {\n ...SessionList_sessions\n }\n `,\n {},\n { fetchPolicy: 'network-only' }\n );\n\n return <SessionList sessionsKey={props} />;\n};\n\nconst errorFallback = ({ error }) => <ErrorResult error={error} />;\n\nconst SessionDrawerContent: React.FC = () => (\n <ErrorBoundary fallback={errorFallback}>\n <Suspense fallback={<SessionListSkeleton />}>\n <SessionDrawerContentLoader />\n </Suspense>\n </ErrorBoundary>\n);\n\nexport default SessionDrawerContent;\n"],"file":"SessionDrawerContent.js"}
@@ -6,9 +6,8 @@ import { Button, message } from '@os-design/core';
6
6
  import styled from '@emotion/styled';
7
7
  import { useTranslation } from 'react-i18next';
8
8
  import { clr } from '@os-design/theming';
9
- import { ConnectionHandler } from 'relay-runtime';
10
9
  import SessionListItem from './SessionListItem';
11
- const sessionListFragment = _SessionList_sessions !== void 0 ? _SessionList_sessions : (_SessionList_sessions = require("./__generated__/SessionList_sessions.graphql"), _SessionList_sessions.hash && _SessionList_sessions.hash !== "ffc097fbe501d309e554b7f98ebedd67" && console.error("The definition of 'SessionList_sessions' appears to have changed. Run `relay-compiler` to update the generated files to receive the expected data."), _SessionList_sessions);
10
+ const sessionListFragment = _SessionList_sessions !== void 0 ? _SessionList_sessions : (_SessionList_sessions = require("./__generated__/SessionList_sessions.graphql"), _SessionList_sessions.hash && _SessionList_sessions.hash !== "1b21c937c7ba795f09bfcb5ada7d2510" && console.error("The definition of 'SessionList_sessions' appears to have changed. Run `relay-compiler` to update the generated files to receive the expected data."), _SessionList_sessions);
12
11
  export const Title = styled.div`
13
12
  font-weight: 500;
14
13
  margin: 1em 1em 0.5em;
@@ -31,12 +30,14 @@ export const SESSION_LIST_PADDING_VERTICAL = 0.5;
31
30
  const SessionList = ({
32
31
  sessionsKey
33
32
  }) => {
34
- const data = useFragment(sessionListFragment, sessionsKey);
33
+ const {
34
+ sessions
35
+ } = useFragment(sessionListFragment, sessionsKey);
35
36
  const {
36
37
  t
37
38
  } = useTranslation('profile');
38
- const currentSession = useMemo(() => data.sessions.edges.find(edge => edge.node.current), [data.sessions.edges]);
39
- const otherSessions = useMemo(() => data.sessions.edges.filter(edge => !edge.node.current).sort((a, b) => new Date(b.node.lastSeenAt).getTime() - new Date(a.node.lastSeenAt).getTime()), [data.sessions.edges]);
39
+ const currentSession = useMemo(() => sessions.find(session => session.current), [sessions]);
40
+ const otherSessions = useMemo(() => sessions.filter(session => !session.current).sort((a, b) => new Date(b.lastSeenAt).getTime() - new Date(a.lastSeenAt).getTime()), [sessions]);
40
41
  const [commitDestroyAllOtherSessions, loadingDestroyAllOtherSessions] = useMutation(_SessionListDestroyAllOtherSessionsMutation !== void 0 ? _SessionListDestroyAllOtherSessionsMutation : (_SessionListDestroyAllOtherSessionsMutation = require("./__generated__/SessionListDestroyAllOtherSessionsMutation.graphql"), _SessionListDestroyAllOtherSessionsMutation.hash && _SessionListDestroyAllOtherSessionsMutation.hash !== "016b6b5e7ae228f7df552d97fa43bd40" && console.error("The definition of 'SessionListDestroyAllOtherSessionsMutation' appears to have changed. Run `relay-compiler` to update the generated files to receive the expected data."), _SessionListDestroyAllOtherSessionsMutation));
41
42
  const destroyAllOtherSessions = useCallback(() => {
42
43
  commitDestroyAllOtherSessions({
@@ -44,10 +45,9 @@ const SessionList = ({
44
45
  updater: store => {
45
46
  const record = store.get('client:root');
46
47
  if (!record) return;
47
- const conn = ConnectionHandler.getConnection(record, 'SessionList_sessions');
48
- if (!conn) return;
49
- const edges = (conn.getLinkedRecords('edges') || []).filter(edge => edge.getLinkedRecord('node')?.getValue('id') === currentSession?.node.id);
50
- conn.setLinkedRecords(edges, 'edges');
48
+ const sessionRecords = record.getLinkedRecords('sessions');
49
+ if (!sessionRecords) return;
50
+ record.setLinkedRecords(sessionRecords.filter(item => item.getDataID() === (currentSession === null || currentSession === void 0 ? void 0 : currentSession.id)), 'sessions');
51
51
  },
52
52
  onError: error => {
53
53
  message.error(error.message);
@@ -56,9 +56,9 @@ const SessionList = ({
56
56
  message.success(t('profile:sessions.destroyedAllOther'));
57
57
  }
58
58
  });
59
- }, [commitDestroyAllOtherSessions, currentSession?.node.id, t]);
59
+ }, [commitDestroyAllOtherSessions, currentSession === null || currentSession === void 0 ? void 0 : currentSession.id, t]);
60
60
  return /*#__PURE__*/React.createElement(React.Fragment, null, currentSession && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Title, null, t('profile:sessions.current')), /*#__PURE__*/React.createElement(List, null, /*#__PURE__*/React.createElement(SessionListItem, {
61
- sessionKey: currentSession.node,
61
+ sessionKey: currentSession,
62
62
  hideLastSeenAt: true
63
63
  }))), otherSessions.length > 0 && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(DestroyAllOtherSessionsButton, {
64
64
  type: "ghost",
@@ -67,9 +67,9 @@ const SessionList = ({
67
67
  wide: "always",
68
68
  loading: loadingDestroyAllOtherSessions,
69
69
  onClick: destroyAllOtherSessions
70
- }, t('profile:sessions.destroyAllOther')), /*#__PURE__*/React.createElement(OtherSessions, null, /*#__PURE__*/React.createElement(Title, null, t('profile:sessions.other'), " (", otherSessions.length, ")"), /*#__PURE__*/React.createElement(List, null, otherSessions.map(edge => /*#__PURE__*/React.createElement(SessionListItem, {
71
- key: edge.node.id,
72
- sessionKey: edge.node
70
+ }, t('profile:sessions.destroyAllOther')), /*#__PURE__*/React.createElement(OtherSessions, null, /*#__PURE__*/React.createElement(Title, null, t('profile:sessions.other'), " (", otherSessions.length, ")"), /*#__PURE__*/React.createElement(List, null, otherSessions.map(session => /*#__PURE__*/React.createElement(SessionListItem, {
71
+ key: session.id,
72
+ sessionKey: session
73
73
  }))))));
74
74
  };
75
75
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/components/session/SessionList.tsx"],"names":["React","useCallback","useMemo","useFragment","useMutation","Button","message","styled","useTranslation","clr","ConnectionHandler","SessionListItem","sessionListFragment","Title","div","List","p","theme","listItemColorBorder","DestroyAllOtherSessionsButton","OtherSessions","SESSION_LIST_PADDING_VERTICAL","SessionList","sessionsKey","data","t","currentSession","sessions","edges","find","edge","node","current","otherSessions","filter","sort","a","b","Date","lastSeenAt","getTime","commitDestroyAllOtherSessions","loadingDestroyAllOtherSessions","destroyAllOtherSessions","variables","updater","store","record","get","conn","getConnection","getLinkedRecords","getLinkedRecord","getValue","id","setLinkedRecords","onError","error","onCompleted","success","length","map"],"mappings":"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","sourcesContent":["import React, { useCallback, useMemo } from 'react';\nimport graphql from 'babel-plugin-relay/macro';\nimport { useFragment, useMutation } from 'react-relay/hooks';\nimport { Button, message } from '@os-design/core';\nimport styled from '@emotion/styled';\nimport { useTranslation } from 'react-i18next';\nimport { clr } from '@os-design/theming';\nimport { ConnectionHandler } from 'relay-runtime';\nimport { SessionList_sessions$key } from './__generated__/SessionList_sessions.graphql';\nimport SessionListItem from './SessionListItem';\nimport { SessionListDestroyAllOtherSessionsMutation } from './__generated__/SessionListDestroyAllOtherSessionsMutation.graphql';\n\nconst sessionListFragment = graphql`\n fragment SessionList_sessions on Query\n @argumentDefinitions(count: { type: \"Int\" }, cursor: { type: \"String\" }) {\n sessions(first: $count, after: $cursor)\n @connection(key: \"SessionList_sessions\", filters: []) {\n edges {\n node {\n id\n current\n lastSeenAt\n ...SessionListItem_session\n }\n }\n }\n }\n`;\n\ninterface SessionListProps {\n sessionsKey: SessionList_sessions$key;\n}\n\nexport const Title = styled.div`\n font-weight: 500;\n margin: 1em 1em 0.5em;\n`;\n\nexport const List = styled.div`\n border-top: 1px solid ${(p) => clr(p.theme.listItemColorBorder)};\n border-bottom: 1px solid ${(p) => clr(p.theme.listItemColorBorder)};\n`;\n\nconst DestroyAllOtherSessionsButton = styled(Button)`\n & > span {\n flex: 1;\n text-align: left;\n }\n`;\n\nconst OtherSessions = styled.div`\n margin-top: 2em;\n`;\n\nexport const SESSION_LIST_PADDING_VERTICAL = 0.5;\n\nconst SessionList: React.FC<SessionListProps> = ({ sessionsKey }) => {\n const data = useFragment(sessionListFragment, sessionsKey);\n const { t } = useTranslation('profile');\n\n const currentSession = useMemo(\n () => data.sessions.edges.find((edge) => edge.node.current),\n [data.sessions.edges]\n );\n\n const otherSessions = useMemo(\n () =>\n data.sessions.edges\n .filter((edge) => !edge.node.current)\n .sort(\n (a, b) =>\n new Date(b.node.lastSeenAt).getTime() -\n new Date(a.node.lastSeenAt).getTime()\n ),\n [data.sessions.edges]\n );\n\n const [commitDestroyAllOtherSessions, loadingDestroyAllOtherSessions] =\n useMutation<SessionListDestroyAllOtherSessionsMutation>(graphql`\n mutation SessionListDestroyAllOtherSessionsMutation {\n destroyAllOtherSessions {\n ok\n }\n }\n `);\n\n const destroyAllOtherSessions = useCallback(() => {\n commitDestroyAllOtherSessions({\n variables: {},\n updater: (store) => {\n const record = store.get('client:root');\n if (!record) return;\n\n const conn = ConnectionHandler.getConnection(\n record,\n 'SessionList_sessions'\n );\n if (!conn) return;\n\n const edges = (conn.getLinkedRecords('edges') || []).filter(\n (edge) =>\n edge.getLinkedRecord('node')?.getValue('id') ===\n currentSession?.node.id\n );\n\n conn.setLinkedRecords(edges, 'edges');\n },\n onError: (error) => {\n message.error(error.message);\n },\n onCompleted: () => {\n message.success(t('profile:sessions.destroyedAllOther'));\n },\n });\n }, [commitDestroyAllOtherSessions, currentSession?.node.id, t]);\n\n return (\n <>\n {currentSession && (\n <>\n <Title>{t('profile:sessions.current')}</Title>\n <List>\n <SessionListItem sessionKey={currentSession.node} hideLastSeenAt />\n </List>\n </>\n )}\n\n {otherSessions.length > 0 && (\n <>\n <DestroyAllOtherSessionsButton\n type='ghost'\n danger\n size='small'\n wide='always'\n loading={loadingDestroyAllOtherSessions}\n onClick={destroyAllOtherSessions}\n >\n {t('profile:sessions.destroyAllOther')}\n </DestroyAllOtherSessionsButton>\n\n <OtherSessions>\n <Title>\n {t('profile:sessions.other')} ({otherSessions.length})\n </Title>\n <List>\n {otherSessions.map((edge) => (\n <SessionListItem key={edge.node.id} sessionKey={edge.node} />\n ))}\n </List>\n </OtherSessions>\n </>\n )}\n </>\n );\n};\n\nexport default SessionList;\n"],"file":"SessionList.js"}
1
+ {"version":3,"sources":["../../../../src/lib/components/session/SessionList.tsx"],"names":["React","useCallback","useMemo","useFragment","useMutation","Button","message","styled","useTranslation","clr","SessionListItem","sessionListFragment","Title","div","List","p","theme","listItemColorBorder","DestroyAllOtherSessionsButton","OtherSessions","SESSION_LIST_PADDING_VERTICAL","SessionList","sessionsKey","sessions","t","currentSession","find","session","current","otherSessions","filter","sort","a","b","Date","lastSeenAt","getTime","commitDestroyAllOtherSessions","loadingDestroyAllOtherSessions","destroyAllOtherSessions","variables","updater","store","record","get","sessionRecords","getLinkedRecords","setLinkedRecords","item","getDataID","id","onError","error","onCompleted","success","length","map"],"mappings":"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","sourcesContent":["import React, { useCallback, useMemo } from 'react';\nimport graphql from 'babel-plugin-relay/macro';\nimport { useFragment, useMutation } from 'react-relay/hooks';\nimport { Button, message } from '@os-design/core';\nimport styled from '@emotion/styled';\nimport { useTranslation } from 'react-i18next';\nimport { clr } from '@os-design/theming';\nimport { SessionList_sessions$key } from './__generated__/SessionList_sessions.graphql';\nimport SessionListItem from './SessionListItem';\nimport { SessionListDestroyAllOtherSessionsMutation } from './__generated__/SessionListDestroyAllOtherSessionsMutation.graphql';\n\nconst sessionListFragment = graphql`\n fragment SessionList_sessions on Query\n @refetchable(queryName: \"SessionListRefetchQuery\") {\n sessions {\n id\n current\n lastSeenAt\n ...SessionListItem_session\n }\n }\n`;\n\ninterface SessionListProps {\n sessionsKey: SessionList_sessions$key;\n}\n\nexport const Title = styled.div`\n font-weight: 500;\n margin: 1em 1em 0.5em;\n`;\n\nexport const List = styled.div`\n border-top: 1px solid ${(p) => clr(p.theme.listItemColorBorder)};\n border-bottom: 1px solid ${(p) => clr(p.theme.listItemColorBorder)};\n`;\n\nconst DestroyAllOtherSessionsButton = styled(Button)`\n & > span {\n flex: 1;\n text-align: left;\n }\n`;\n\nconst OtherSessions = styled.div`\n margin-top: 2em;\n`;\n\nexport const SESSION_LIST_PADDING_VERTICAL = 0.5;\n\nconst SessionList: React.FC<SessionListProps> = ({ sessionsKey }) => {\n const { sessions } = useFragment(sessionListFragment, sessionsKey);\n const { t } = useTranslation('profile');\n\n const currentSession = useMemo(\n () => sessions.find((session) => session.current),\n [sessions]\n );\n\n const otherSessions = useMemo(\n () =>\n sessions\n .filter((session) => !session.current)\n .sort(\n (a, b) =>\n new Date(b.lastSeenAt).getTime() - new Date(a.lastSeenAt).getTime()\n ),\n [sessions]\n );\n\n const [commitDestroyAllOtherSessions, loadingDestroyAllOtherSessions] =\n useMutation<SessionListDestroyAllOtherSessionsMutation>(graphql`\n mutation SessionListDestroyAllOtherSessionsMutation {\n destroyAllOtherSessions {\n ok\n }\n }\n `);\n\n const destroyAllOtherSessions = useCallback(() => {\n commitDestroyAllOtherSessions({\n variables: {},\n updater: (store) => {\n const record = store.get('client:root');\n if (!record) return;\n\n const sessionRecords = record.getLinkedRecords('sessions');\n if (!sessionRecords) return;\n\n record.setLinkedRecords(\n sessionRecords.filter(\n (item) => item.getDataID() === currentSession?.id\n ),\n 'sessions'\n );\n },\n onError: (error) => {\n message.error(error.message);\n },\n onCompleted: () => {\n message.success(t('profile:sessions.destroyedAllOther'));\n },\n });\n }, [commitDestroyAllOtherSessions, currentSession?.id, t]);\n\n return (\n <>\n {currentSession && (\n <>\n <Title>{t('profile:sessions.current')}</Title>\n <List>\n <SessionListItem sessionKey={currentSession} hideLastSeenAt />\n </List>\n </>\n )}\n\n {otherSessions.length > 0 && (\n <>\n <DestroyAllOtherSessionsButton\n type='ghost'\n danger\n size='small'\n wide='always'\n loading={loadingDestroyAllOtherSessions}\n onClick={destroyAllOtherSessions}\n >\n {t('profile:sessions.destroyAllOther')}\n </DestroyAllOtherSessionsButton>\n\n <OtherSessions>\n <Title>\n {t('profile:sessions.other')} ({otherSessions.length})\n </Title>\n <List>\n {otherSessions.map((session) => (\n <SessionListItem key={session.id} sessionKey={session} />\n ))}\n </List>\n </OtherSessions>\n </>\n )}\n </>\n );\n};\n\nexport default SessionList;\n"],"file":"SessionList.js"}
@@ -1,7 +1,6 @@
1
1
  var _SessionListItem_session, _SessionListItemDestroySessionMutation;
2
2
 
3
3
  import React, { useCallback, useMemo } from 'react';
4
- import { ConnectionHandler } from 'relay-runtime';
5
4
  import { useFragment, useMutation } from 'react-relay/hooks';
6
5
  import styled from '@emotion/styled';
7
6
  import { useTranslation } from 'react-i18next';
@@ -199,9 +198,9 @@ const SessionListItem = ({
199
198
  updater: store => {
200
199
  const record = store.get('client:root');
201
200
  if (!record) return;
202
- const conn = ConnectionHandler.getConnection(record, 'SessionList_sessions');
203
- if (!conn) return;
204
- ConnectionHandler.deleteNode(conn, session.id);
201
+ const sessionRecords = record.getLinkedRecords('sessions');
202
+ if (!sessionRecords) return;
203
+ record.setLinkedRecords(sessionRecords.filter(item => item.getDataID() !== session.id), 'sessions');
205
204
  },
206
205
  onError: error => {
207
206
  message.error(error.message);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/components/session/SessionListItem.tsx"],"names":["React","useCallback","useMemo","ConnectionHandler","useFragment","useMutation","styled","useTranslation","pluralForms","Button","message","ellipsisStyles","horizontalPaddingStyles","transitionStyles","clr","isTouchDevice","omitEmotionProps","useSwipe","SignOut","css","getLastSeen","formatDate","UnknownDeviceIcon","BrowserIcon","AppleIcon","AndroidIcon","sessionListItemFragment","Container","div","p","theme","listItemColorBorder","Info","sizes","small","Content","Title","LastSeen","inputColorPlaceholder","hasSwipeStyles","hasSwipe","openedStyles","opened","Actions","colorBg","slice","listItemActionsPaddingLeft","IconContainer","Icon","borderRadius","bgColor","nameVersionToString","name","version","mergeInfo","args","filter","item","join","SessionListItem","sessionKey","hideLastSeenAt","session","t","i18n","touchDevice","handlers","browser","browserName","browserVersion","os","osName","osVersion","deviceBrandModel","arr","deviceBrand","deviceModel","deviceManufacturer","unshift","title","deviceType","toLowerCase","returnObjects","deviceName","deviceInfo","isApp","ip","location","city","country","lastSeen","lsa","lastSeenAt","language","forms","number","iconComponent","iconColor","commitDestroySession","loadingDestroySession","destroySession","variables","input","id","updater","store","record","get","conn","getConnection","deleteNode","onError","error","onCompleted","success"],"mappings":"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","sourcesContent":["import React, { useCallback, useMemo } from 'react';\nimport graphql from 'babel-plugin-relay/macro';\nimport { ConnectionHandler } from 'relay-runtime';\nimport { useFragment, useMutation } from 'react-relay/hooks';\nimport styled from '@emotion/styled';\nimport { useTranslation } from 'react-i18next';\nimport pluralForms from '@os-team/plural-forms';\nimport { Button, message } from '@os-design/core';\nimport {\n ellipsisStyles,\n horizontalPaddingStyles,\n transitionStyles,\n} from '@os-design/styles';\nimport { clr, Color } from '@os-design/theming';\nimport { isTouchDevice, omitEmotionProps, useSwipe } from '@os-design/utils';\nimport { SignOut } from '@os-design/icons';\nimport { css } from '@emotion/react';\nimport { SessionListItem_session$key } from './__generated__/SessionListItem_session.graphql';\nimport getLastSeen from './getLastSeen';\nimport formatDate from './formatDate';\nimport { SessionListItemDestroySessionMutation } from './__generated__/SessionListItemDestroySessionMutation.graphql';\nimport UnknownDeviceIcon from '../shared/icons/UnknownDeviceIcon';\nimport BrowserIcon from '../shared/icons/BrowserIcon';\nimport AppleIcon from '../shared/icons/AppleIcon';\nimport AndroidIcon from '../shared/icons/AndroidIcon';\n\nconst sessionListItemFragment = graphql`\n fragment SessionListItem_session on SessionPayload {\n id\n isApp\n browserName\n browserVersion\n osName\n osVersion\n deviceType\n deviceName\n deviceManufacturer\n deviceBrand\n deviceModel\n ip\n country\n city\n lastSeenAt\n }\n`;\n\ninterface SessionListItemProps {\n sessionKey: SessionListItem_session$key;\n hideLastSeenAt?: boolean;\n}\n\nexport const Container = styled.div`\n display: flex;\n position: relative;\n padding: 0.5em 0;\n overflow: hidden;\n\n &:not(:last-of-type) {\n border-bottom: 1px solid ${(p) => clr(p.theme.listItemColorBorder)};\n }\n\n @media (hover: hover) {\n // Hide actions by default\n & > nav {\n opacity: 0;\n }\n\n // Display actions either on focus, or on hover\n &:hover,\n &:focus-within {\n & > nav {\n opacity: 1;\n }\n }\n }\n\n ${horizontalPaddingStyles()};\n`;\n\nconst Info = styled.div`\n font-size: ${(p) => p.theme.sizes.small}em;\n ${ellipsisStyles};\n`;\n\nexport const Content = styled.div`\n flex: 1;\n overflow: hidden;\n`;\n\nconst Title = styled(Info)`\n font-weight: 500;\n`;\n\nconst LastSeen = styled(Info)`\n color: ${(p) => clr(p.theme.inputColorPlaceholder)};\n`;\n\nconst hasSwipeStyles = (p) =>\n p.hasSwipe &&\n css`\n transform: translateX(100%);\n ${transitionStyles('transform')(p)};\n `;\n\nconst openedStyles = (p) =>\n p.opened &&\n css`\n transform: translateX(0);\n `;\n\ninterface ActionsProps {\n hasSwipe: boolean;\n opened: boolean;\n}\nconst Actions = styled(\n 'nav',\n omitEmotionProps('hasSwipe', 'opened')\n)<ActionsProps>`\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n\n display: flex;\n align-items: center;\n\n background: linear-gradient(\n to right,\n ${(p) => clr([...p.theme.colorBg.slice(0, 3), 0] as Color)},\n ${(p) => clr(p.theme.colorBg)}\n ${(p) => p.theme.listItemActionsPaddingLeft}em\n );\n\n ${hasSwipeStyles};\n ${openedStyles};\n ${horizontalPaddingStyles('right')};\n`;\n\nexport const IconContainer = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n margin-right: 0.6em;\n`;\n\ninterface IconProps {\n bgColor: string;\n}\nexport const Icon = styled('div', omitEmotionProps('bgColor'))<IconProps>`\n font-size: 1.4em;\n width: 1.3em;\n height: 1.3em;\n\n svg {\n height: 1.3em;\n }\n\n display: flex;\n justify-content: center;\n align-items: center;\n\n border-radius: ${(p) => p.theme.borderRadius}em;\n background-color: ${(p) => p.bgColor};\n color: hsl(0, 0%, 100%);\n`;\n\nconst nameVersionToString = (\n name: string | null,\n version: string | null\n): string | null => {\n if (!name) return null;\n return `${name}${version ? ` ${version}` : ''}`;\n};\n\nconst mergeInfo = (...args: Array<string | null>): string | null =>\n args.filter((item) => item !== null).join(', ') || null;\n\nconst SessionListItem: React.FC<SessionListItemProps> = ({\n sessionKey,\n hideLastSeenAt,\n}) => {\n const session = useFragment(sessionListItemFragment, sessionKey);\n const { t, i18n } = useTranslation('profile');\n const touchDevice = useMemo(() => isTouchDevice(), []);\n const { opened, handlers } = useSwipe();\n\n const browser = useMemo(\n () => nameVersionToString(session.browserName, session.browserVersion),\n [session.browserName, session.browserVersion]\n );\n\n const os = useMemo(\n () => nameVersionToString(session.osName, session.osVersion),\n [session.osName, session.osVersion]\n );\n\n const deviceBrandModel = useMemo(() => {\n const arr = [session.deviceBrand, session.deviceModel];\n // Include the manufacturer name only if it does not equal to the brand name.\n // For example, it allows to avoid \"Apple Apple iPhone 6\".\n if (session.deviceManufacturer !== session.deviceBrand) {\n arr.unshift(session.deviceManufacturer);\n }\n return arr.filter((item) => item !== null).join(' ') || null;\n }, [session.deviceBrand, session.deviceManufacturer, session.deviceModel]);\n\n const title = useMemo(() => {\n let deviceType = (session.deviceType || 'unknown').toLowerCase();\n if (browser) deviceType = 'browser';\n return `${\n t('profile:sessions.deviceType', { returnObjects: true })[deviceType]\n }${session.deviceName ? ` ${session.deviceName}` : ''}`;\n }, [browser, session.deviceName, session.deviceType, t]);\n\n const deviceInfo = useMemo(\n () =>\n session.isApp ? mergeInfo(deviceBrandModel, os) : mergeInfo(browser, os),\n [browser, deviceBrandModel, os, session.isApp]\n );\n\n const ip = useMemo(() => {\n if (!session.ip) return null;\n const location = mergeInfo(session.city, session.country);\n return `${session.ip}${location ? ` (${location})` : ''}`;\n }, [session.city, session.country, session.ip]);\n\n const lastSeen = useMemo(() => {\n const lsa = getLastSeen(session.lastSeenAt);\n if (!lsa) {\n return `${t('profile:sessions.lastSeenOn')} ${formatDate(\n session.lastSeenAt,\n t,\n i18n.language\n )}`;\n }\n return `${t('profile:sessions.lastSeen')} ${lsa[0]} ${pluralForms({\n language: i18n.language,\n forms: t(`profile:sessions.${lsa[1]}`, { returnObjects: true }),\n number: lsa[0],\n })} ${t('profile:sessions.ago')}`;\n }, [i18n.language, session.lastSeenAt, t]);\n\n const [iconComponent, iconColor] = useMemo(() => {\n if (browser) return [<BrowserIcon />, 'hsl(30, 60%, 50%)'];\n if (session.isApp) {\n if (session.osName === 'iOS' || session.osName === 'iPhone OS') {\n return [<AppleIcon />, 'hsl(0, 0%, 50%)'];\n }\n if (session.osName === 'Android')\n return [<AndroidIcon />, 'hsl(150, 60%, 50%)'];\n }\n return [<UnknownDeviceIcon />, 'hsl(5, 60%, 50%)'];\n }, [browser, session.isApp, session.osName]);\n\n const [commitDestroySession, loadingDestroySession] =\n useMutation<SessionListItemDestroySessionMutation>(graphql`\n mutation SessionListItemDestroySessionMutation(\n $input: DestroySessionInput!\n ) {\n destroySession(input: $input) {\n ok\n }\n }\n `);\n\n const destroySession = useCallback(() => {\n commitDestroySession({\n variables: {\n input: {\n id: session.id,\n },\n },\n updater: (store) => {\n const record = store.get('client:root');\n if (!record) return;\n\n const conn = ConnectionHandler.getConnection(\n record,\n 'SessionList_sessions'\n );\n if (!conn) return;\n\n ConnectionHandler.deleteNode(conn, session.id);\n },\n onError: (error) => {\n message.error(error.message);\n },\n onCompleted: () => {\n message.success(t('profile:sessions.destroyed'));\n },\n });\n }, [commitDestroySession, session.id, t]);\n\n return (\n <Container {...handlers}>\n <IconContainer>\n <Icon bgColor={iconColor}>{iconComponent}</Icon>\n </IconContainer>\n\n <Content>\n <Title>{title}</Title>\n {deviceInfo && <Info>{deviceInfo}</Info>}\n {ip && <Info>{ip}</Info>}\n {!hideLastSeenAt && <LastSeen>{lastSeen}</LastSeen>}\n </Content>\n\n <Actions hasSwipe={touchDevice} opened={opened}>\n <Button\n type='ghost'\n wide='never'\n size='small'\n loading={loadingDestroySession}\n onClick={destroySession}\n >\n <SignOut />\n </Button>\n </Actions>\n </Container>\n );\n};\n\nexport default SessionListItem;\n"],"file":"SessionListItem.js"}
1
+ {"version":3,"sources":["../../../../src/lib/components/session/SessionListItem.tsx"],"names":["React","useCallback","useMemo","useFragment","useMutation","styled","useTranslation","pluralForms","Button","message","ellipsisStyles","horizontalPaddingStyles","transitionStyles","clr","isTouchDevice","omitEmotionProps","useSwipe","SignOut","css","getLastSeen","formatDate","UnknownDeviceIcon","BrowserIcon","AppleIcon","AndroidIcon","sessionListItemFragment","Container","div","p","theme","listItemColorBorder","Info","sizes","small","Content","Title","LastSeen","inputColorPlaceholder","hasSwipeStyles","hasSwipe","openedStyles","opened","Actions","colorBg","slice","listItemActionsPaddingLeft","IconContainer","Icon","borderRadius","bgColor","nameVersionToString","name","version","mergeInfo","args","filter","item","join","SessionListItem","sessionKey","hideLastSeenAt","session","t","i18n","touchDevice","handlers","browser","browserName","browserVersion","os","osName","osVersion","deviceBrandModel","arr","deviceBrand","deviceModel","deviceManufacturer","unshift","title","deviceType","toLowerCase","returnObjects","deviceName","deviceInfo","isApp","ip","location","city","country","lastSeen","lsa","lastSeenAt","language","forms","number","iconComponent","iconColor","commitDestroySession","loadingDestroySession","destroySession","variables","input","id","updater","store","record","get","sessionRecords","getLinkedRecords","setLinkedRecords","getDataID","onError","error","onCompleted","success"],"mappings":"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","sourcesContent":["import React, { useCallback, useMemo } from 'react';\nimport graphql from 'babel-plugin-relay/macro';\nimport { useFragment, useMutation } from 'react-relay/hooks';\nimport styled from '@emotion/styled';\nimport { useTranslation } from 'react-i18next';\nimport pluralForms from '@os-team/plural-forms';\nimport { Button, message } from '@os-design/core';\nimport {\n ellipsisStyles,\n horizontalPaddingStyles,\n transitionStyles,\n} from '@os-design/styles';\nimport { clr, Color } from '@os-design/theming';\nimport { isTouchDevice, omitEmotionProps, useSwipe } from '@os-design/utils';\nimport { SignOut } from '@os-design/icons';\nimport { css } from '@emotion/react';\nimport { SessionListItem_session$key } from './__generated__/SessionListItem_session.graphql';\nimport getLastSeen from './getLastSeen';\nimport formatDate from './formatDate';\nimport { SessionListItemDestroySessionMutation } from './__generated__/SessionListItemDestroySessionMutation.graphql';\nimport UnknownDeviceIcon from '../shared/icons/UnknownDeviceIcon';\nimport BrowserIcon from '../shared/icons/BrowserIcon';\nimport AppleIcon from '../shared/icons/AppleIcon';\nimport AndroidIcon from '../shared/icons/AndroidIcon';\n\nconst sessionListItemFragment = graphql`\n fragment SessionListItem_session on SessionPayload {\n id\n isApp\n browserName\n browserVersion\n osName\n osVersion\n deviceType\n deviceName\n deviceManufacturer\n deviceBrand\n deviceModel\n ip\n country\n city\n lastSeenAt\n }\n`;\n\ninterface SessionListItemProps {\n sessionKey: SessionListItem_session$key;\n hideLastSeenAt?: boolean;\n}\n\nexport const Container = styled.div`\n display: flex;\n position: relative;\n padding: 0.5em 0;\n overflow: hidden;\n\n &:not(:last-of-type) {\n border-bottom: 1px solid ${(p) => clr(p.theme.listItemColorBorder)};\n }\n\n @media (hover: hover) {\n // Hide actions by default\n & > nav {\n opacity: 0;\n }\n\n // Display actions either on focus, or on hover\n &:hover,\n &:focus-within {\n & > nav {\n opacity: 1;\n }\n }\n }\n\n ${horizontalPaddingStyles()};\n`;\n\nconst Info = styled.div`\n font-size: ${(p) => p.theme.sizes.small}em;\n ${ellipsisStyles};\n`;\n\nexport const Content = styled.div`\n flex: 1;\n overflow: hidden;\n`;\n\nconst Title = styled(Info)`\n font-weight: 500;\n`;\n\nconst LastSeen = styled(Info)`\n color: ${(p) => clr(p.theme.inputColorPlaceholder)};\n`;\n\nconst hasSwipeStyles = (p) =>\n p.hasSwipe &&\n css`\n transform: translateX(100%);\n ${transitionStyles('transform')(p)};\n `;\n\nconst openedStyles = (p) =>\n p.opened &&\n css`\n transform: translateX(0);\n `;\n\ninterface ActionsProps {\n hasSwipe: boolean;\n opened: boolean;\n}\nconst Actions = styled(\n 'nav',\n omitEmotionProps('hasSwipe', 'opened')\n)<ActionsProps>`\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n\n display: flex;\n align-items: center;\n\n background: linear-gradient(\n to right,\n ${(p) => clr([...p.theme.colorBg.slice(0, 3), 0] as Color)},\n ${(p) => clr(p.theme.colorBg)}\n ${(p) => p.theme.listItemActionsPaddingLeft}em\n );\n\n ${hasSwipeStyles};\n ${openedStyles};\n ${horizontalPaddingStyles('right')};\n`;\n\nexport const IconContainer = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n margin-right: 0.6em;\n`;\n\ninterface IconProps {\n bgColor: string;\n}\nexport const Icon = styled('div', omitEmotionProps('bgColor'))<IconProps>`\n font-size: 1.4em;\n width: 1.3em;\n height: 1.3em;\n\n svg {\n height: 1.3em;\n }\n\n display: flex;\n justify-content: center;\n align-items: center;\n\n border-radius: ${(p) => p.theme.borderRadius}em;\n background-color: ${(p) => p.bgColor};\n color: hsl(0, 0%, 100%);\n`;\n\nconst nameVersionToString = (\n name: string | null,\n version: string | null\n): string | null => {\n if (!name) return null;\n return `${name}${version ? ` ${version}` : ''}`;\n};\n\nconst mergeInfo = (...args: Array<string | null>): string | null =>\n args.filter((item) => item !== null).join(', ') || null;\n\nconst SessionListItem: React.FC<SessionListItemProps> = ({\n sessionKey,\n hideLastSeenAt,\n}) => {\n const session = useFragment(sessionListItemFragment, sessionKey);\n const { t, i18n } = useTranslation('profile');\n const touchDevice = useMemo(() => isTouchDevice(), []);\n const { opened, handlers } = useSwipe();\n\n const browser = useMemo(\n () => nameVersionToString(session.browserName, session.browserVersion),\n [session.browserName, session.browserVersion]\n );\n\n const os = useMemo(\n () => nameVersionToString(session.osName, session.osVersion),\n [session.osName, session.osVersion]\n );\n\n const deviceBrandModel = useMemo(() => {\n const arr = [session.deviceBrand, session.deviceModel];\n // Include the manufacturer name only if it does not equal to the brand name.\n // For example, it allows to avoid \"Apple Apple iPhone 6\".\n if (session.deviceManufacturer !== session.deviceBrand) {\n arr.unshift(session.deviceManufacturer);\n }\n return arr.filter((item) => item !== null).join(' ') || null;\n }, [session.deviceBrand, session.deviceManufacturer, session.deviceModel]);\n\n const title = useMemo(() => {\n let deviceType = (session.deviceType || 'unknown').toLowerCase();\n if (browser) deviceType = 'browser';\n return `${\n t('profile:sessions.deviceType', { returnObjects: true })[deviceType]\n }${session.deviceName ? ` ${session.deviceName}` : ''}`;\n }, [browser, session.deviceName, session.deviceType, t]);\n\n const deviceInfo = useMemo(\n () =>\n session.isApp ? mergeInfo(deviceBrandModel, os) : mergeInfo(browser, os),\n [browser, deviceBrandModel, os, session.isApp]\n );\n\n const ip = useMemo(() => {\n if (!session.ip) return null;\n const location = mergeInfo(session.city, session.country);\n return `${session.ip}${location ? ` (${location})` : ''}`;\n }, [session.city, session.country, session.ip]);\n\n const lastSeen = useMemo(() => {\n const lsa = getLastSeen(session.lastSeenAt);\n if (!lsa) {\n return `${t('profile:sessions.lastSeenOn')} ${formatDate(\n session.lastSeenAt,\n t,\n i18n.language\n )}`;\n }\n return `${t('profile:sessions.lastSeen')} ${lsa[0]} ${pluralForms({\n language: i18n.language,\n forms: t(`profile:sessions.${lsa[1]}`, { returnObjects: true }),\n number: lsa[0],\n })} ${t('profile:sessions.ago')}`;\n }, [i18n.language, session.lastSeenAt, t]);\n\n const [iconComponent, iconColor] = useMemo(() => {\n if (browser) return [<BrowserIcon />, 'hsl(30, 60%, 50%)'];\n if (session.isApp) {\n if (session.osName === 'iOS' || session.osName === 'iPhone OS') {\n return [<AppleIcon />, 'hsl(0, 0%, 50%)'];\n }\n if (session.osName === 'Android')\n return [<AndroidIcon />, 'hsl(150, 60%, 50%)'];\n }\n return [<UnknownDeviceIcon />, 'hsl(5, 60%, 50%)'];\n }, [browser, session.isApp, session.osName]);\n\n const [commitDestroySession, loadingDestroySession] =\n useMutation<SessionListItemDestroySessionMutation>(graphql`\n mutation SessionListItemDestroySessionMutation(\n $input: DestroySessionInput!\n ) {\n destroySession(input: $input) {\n ok\n }\n }\n `);\n\n const destroySession = useCallback(() => {\n commitDestroySession({\n variables: {\n input: {\n id: session.id,\n },\n },\n updater: (store) => {\n const record = store.get('client:root');\n if (!record) return;\n\n const sessionRecords = record.getLinkedRecords('sessions');\n if (!sessionRecords) return;\n\n record.setLinkedRecords(\n sessionRecords.filter((item) => item.getDataID() !== session.id),\n 'sessions'\n );\n },\n onError: (error) => {\n message.error(error.message);\n },\n onCompleted: () => {\n message.success(t('profile:sessions.destroyed'));\n },\n });\n }, [commitDestroySession, session.id, t]);\n\n return (\n <Container {...handlers}>\n <IconContainer>\n <Icon bgColor={iconColor}>{iconComponent}</Icon>\n </IconContainer>\n\n <Content>\n <Title>{title}</Title>\n {deviceInfo && <Info>{deviceInfo}</Info>}\n {ip && <Info>{ip}</Info>}\n {!hideLastSeenAt && <LastSeen>{lastSeen}</LastSeen>}\n </Content>\n\n <Actions hasSwipe={touchDevice} opened={opened}>\n <Button\n type='ghost'\n wide='never'\n size='small'\n loading={loadingDestroySession}\n onClick={destroySession}\n >\n <SignOut />\n </Button>\n </Actions>\n </Container>\n );\n};\n\nexport default SessionListItem;\n"],"file":"SessionListItem.js"}
@@ -28,20 +28,10 @@ fragment SessionListItem_session on SessionPayload {
28
28
 
29
29
  fragment SessionList_sessions on Query {
30
30
  sessions {
31
- edges {
32
- node {
33
- id
34
- current
35
- lastSeenAt
36
- ...SessionListItem_session
37
- __typename
38
- }
39
- cursor
40
- }
41
- pageInfo {
42
- endCursor
43
- hasNextPage
44
- }
31
+ id
32
+ current
33
+ lastSeenAt
34
+ ...SessionListItem_session
45
35
  }
46
36
  }
47
37
  */
@@ -67,176 +57,117 @@ const node = {
67
57
  "selections": [{
68
58
  "alias": null,
69
59
  "args": null,
70
- "concreteType": "SessionPayloadConnection",
60
+ "concreteType": "SessionPayload",
71
61
  "kind": "LinkedField",
72
62
  "name": "sessions",
73
- "plural": false,
63
+ "plural": true,
74
64
  "selections": [{
75
65
  "alias": null,
76
66
  "args": null,
77
- "concreteType": "SessionPayloadEdge",
78
- "kind": "LinkedField",
79
- "name": "edges",
80
- "plural": true,
81
- "selections": [{
82
- "alias": null,
83
- "args": null,
84
- "concreteType": "SessionPayload",
85
- "kind": "LinkedField",
86
- "name": "node",
87
- "plural": false,
88
- "selections": [{
89
- "alias": null,
90
- "args": null,
91
- "kind": "ScalarField",
92
- "name": "id",
93
- "storageKey": null
94
- }, {
95
- "alias": null,
96
- "args": null,
97
- "kind": "ScalarField",
98
- "name": "current",
99
- "storageKey": null
100
- }, {
101
- "alias": null,
102
- "args": null,
103
- "kind": "ScalarField",
104
- "name": "lastSeenAt",
105
- "storageKey": null
106
- }, {
107
- "alias": null,
108
- "args": null,
109
- "kind": "ScalarField",
110
- "name": "isApp",
111
- "storageKey": null
112
- }, {
113
- "alias": null,
114
- "args": null,
115
- "kind": "ScalarField",
116
- "name": "browserName",
117
- "storageKey": null
118
- }, {
119
- "alias": null,
120
- "args": null,
121
- "kind": "ScalarField",
122
- "name": "browserVersion",
123
- "storageKey": null
124
- }, {
125
- "alias": null,
126
- "args": null,
127
- "kind": "ScalarField",
128
- "name": "osName",
129
- "storageKey": null
130
- }, {
131
- "alias": null,
132
- "args": null,
133
- "kind": "ScalarField",
134
- "name": "osVersion",
135
- "storageKey": null
136
- }, {
137
- "alias": null,
138
- "args": null,
139
- "kind": "ScalarField",
140
- "name": "deviceType",
141
- "storageKey": null
142
- }, {
143
- "alias": null,
144
- "args": null,
145
- "kind": "ScalarField",
146
- "name": "deviceName",
147
- "storageKey": null
148
- }, {
149
- "alias": null,
150
- "args": null,
151
- "kind": "ScalarField",
152
- "name": "deviceManufacturer",
153
- "storageKey": null
154
- }, {
155
- "alias": null,
156
- "args": null,
157
- "kind": "ScalarField",
158
- "name": "deviceBrand",
159
- "storageKey": null
160
- }, {
161
- "alias": null,
162
- "args": null,
163
- "kind": "ScalarField",
164
- "name": "deviceModel",
165
- "storageKey": null
166
- }, {
167
- "alias": null,
168
- "args": null,
169
- "kind": "ScalarField",
170
- "name": "ip",
171
- "storageKey": null
172
- }, {
173
- "alias": null,
174
- "args": null,
175
- "kind": "ScalarField",
176
- "name": "country",
177
- "storageKey": null
178
- }, {
179
- "alias": null,
180
- "args": null,
181
- "kind": "ScalarField",
182
- "name": "city",
183
- "storageKey": null
184
- }, {
185
- "alias": null,
186
- "args": null,
187
- "kind": "ScalarField",
188
- "name": "__typename",
189
- "storageKey": null
190
- }],
191
- "storageKey": null
192
- }, {
193
- "alias": null,
194
- "args": null,
195
- "kind": "ScalarField",
196
- "name": "cursor",
197
- "storageKey": null
198
- }],
67
+ "kind": "ScalarField",
68
+ "name": "id",
199
69
  "storageKey": null
200
70
  }, {
201
71
  "alias": null,
202
72
  "args": null,
203
- "concreteType": "PageInfo",
204
- "kind": "LinkedField",
205
- "name": "pageInfo",
206
- "plural": false,
207
- "selections": [{
208
- "alias": null,
209
- "args": null,
210
- "kind": "ScalarField",
211
- "name": "endCursor",
212
- "storageKey": null
213
- }, {
214
- "alias": null,
215
- "args": null,
216
- "kind": "ScalarField",
217
- "name": "hasNextPage",
218
- "storageKey": null
219
- }],
73
+ "kind": "ScalarField",
74
+ "name": "current",
75
+ "storageKey": null
76
+ }, {
77
+ "alias": null,
78
+ "args": null,
79
+ "kind": "ScalarField",
80
+ "name": "lastSeenAt",
81
+ "storageKey": null
82
+ }, {
83
+ "alias": null,
84
+ "args": null,
85
+ "kind": "ScalarField",
86
+ "name": "isApp",
87
+ "storageKey": null
88
+ }, {
89
+ "alias": null,
90
+ "args": null,
91
+ "kind": "ScalarField",
92
+ "name": "browserName",
93
+ "storageKey": null
94
+ }, {
95
+ "alias": null,
96
+ "args": null,
97
+ "kind": "ScalarField",
98
+ "name": "browserVersion",
99
+ "storageKey": null
100
+ }, {
101
+ "alias": null,
102
+ "args": null,
103
+ "kind": "ScalarField",
104
+ "name": "osName",
105
+ "storageKey": null
106
+ }, {
107
+ "alias": null,
108
+ "args": null,
109
+ "kind": "ScalarField",
110
+ "name": "osVersion",
111
+ "storageKey": null
112
+ }, {
113
+ "alias": null,
114
+ "args": null,
115
+ "kind": "ScalarField",
116
+ "name": "deviceType",
117
+ "storageKey": null
118
+ }, {
119
+ "alias": null,
120
+ "args": null,
121
+ "kind": "ScalarField",
122
+ "name": "deviceName",
123
+ "storageKey": null
124
+ }, {
125
+ "alias": null,
126
+ "args": null,
127
+ "kind": "ScalarField",
128
+ "name": "deviceManufacturer",
129
+ "storageKey": null
130
+ }, {
131
+ "alias": null,
132
+ "args": null,
133
+ "kind": "ScalarField",
134
+ "name": "deviceBrand",
135
+ "storageKey": null
136
+ }, {
137
+ "alias": null,
138
+ "args": null,
139
+ "kind": "ScalarField",
140
+ "name": "deviceModel",
141
+ "storageKey": null
142
+ }, {
143
+ "alias": null,
144
+ "args": null,
145
+ "kind": "ScalarField",
146
+ "name": "ip",
147
+ "storageKey": null
148
+ }, {
149
+ "alias": null,
150
+ "args": null,
151
+ "kind": "ScalarField",
152
+ "name": "country",
153
+ "storageKey": null
154
+ }, {
155
+ "alias": null,
156
+ "args": null,
157
+ "kind": "ScalarField",
158
+ "name": "city",
220
159
  "storageKey": null
221
160
  }],
222
161
  "storageKey": null
223
- }, {
224
- "alias": null,
225
- "args": null,
226
- "filters": [],
227
- "handle": "connection",
228
- "key": "SessionList_sessions",
229
- "kind": "LinkedHandle",
230
- "name": "sessions"
231
162
  }]
232
163
  },
233
164
  "params": {
234
- "cacheID": "6f4db07ee743735ff7fca7e2a3473f24",
165
+ "cacheID": "cc7ef83584759c724bbad21b528477c2",
235
166
  "id": null,
236
167
  "metadata": {},
237
168
  "name": "SessionDrawerContentQuery",
238
169
  "operationKind": "query",
239
- "text": "query SessionDrawerContentQuery {\n ...SessionList_sessions\n}\n\nfragment SessionListItem_session on SessionPayload {\n id\n isApp\n browserName\n browserVersion\n osName\n osVersion\n deviceType\n deviceName\n deviceManufacturer\n deviceBrand\n deviceModel\n ip\n country\n city\n lastSeenAt\n}\n\nfragment SessionList_sessions on Query {\n sessions {\n edges {\n node {\n id\n current\n lastSeenAt\n ...SessionListItem_session\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n}\n"
170
+ "text": "query SessionDrawerContentQuery {\n ...SessionList_sessions\n}\n\nfragment SessionListItem_session on SessionPayload {\n id\n isApp\n browserName\n browserVersion\n osName\n osVersion\n deviceType\n deviceName\n deviceManufacturer\n deviceBrand\n deviceModel\n ip\n country\n city\n lastSeenAt\n}\n\nfragment SessionList_sessions on Query {\n sessions {\n id\n current\n lastSeenAt\n ...SessionListItem_session\n }\n}\n"
240
171
  }
241
172
  };
242
173
  node.hash = '1643ac6b9bd324d389dab9011e55b1ba';