react-native-nitro-auth 0.1.4 → 0.1.6
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.
- package/README.md +55 -2
- package/android/build.gradle +7 -2
- package/android/src/main/cpp/PlatformAuth+Android.cpp +14 -3
- package/android/src/main/java/com/auth/AuthAdapter.kt +100 -3
- package/app.plugin.js +7 -5
- package/cpp/HybridAuth.cpp +58 -13
- package/cpp/HybridAuth.hpp +8 -0
- package/cpp/PlatformAuth.hpp +2 -1
- package/ios/PlatformAuth+iOS.mm +22 -4
- package/lib/commonjs/Auth.web.js +48 -10
- package/lib/commonjs/Auth.web.js.map +1 -1
- package/lib/commonjs/AuthStorage.nitro.js +6 -0
- package/lib/commonjs/AuthStorage.nitro.js.map +1 -0
- package/lib/commonjs/index.js +12 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/index.web.js +12 -0
- package/lib/commonjs/index.web.js.map +1 -1
- package/lib/module/Auth.web.js +48 -10
- package/lib/module/Auth.web.js.map +1 -1
- package/lib/module/AuthStorage.nitro.js +4 -0
- package/lib/module/AuthStorage.nitro.js.map +1 -0
- package/lib/module/index.js +1 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/index.web.js +1 -0
- package/lib/module/index.web.js.map +1 -1
- package/lib/typescript/Auth.nitro.d.ts +4 -0
- package/lib/typescript/Auth.nitro.d.ts.map +1 -1
- package/lib/typescript/Auth.web.d.ts +8 -1
- package/lib/typescript/Auth.web.d.ts.map +1 -1
- package/lib/typescript/AuthStorage.nitro.d.ts +19 -0
- package/lib/typescript/AuthStorage.nitro.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +1 -0
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/index.web.d.ts +1 -0
- package/lib/typescript/index.web.d.ts.map +1 -1
- package/nitrogen/generated/android/NitroAuth+autolinking.cmake +2 -1
- package/nitrogen/generated/android/NitroAuth+autolinking.gradle +1 -1
- package/nitrogen/generated/android/NitroAuthOnLoad.cpp +1 -1
- package/nitrogen/generated/android/NitroAuthOnLoad.hpp +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/com/auth/NitroAuthOnLoad.kt +1 -1
- package/nitrogen/generated/ios/NitroAuth+autolinking.rb +1 -1
- package/nitrogen/generated/ios/NitroAuth-Swift-Cxx-Bridge.cpp +1 -1
- package/nitrogen/generated/ios/NitroAuth-Swift-Cxx-Bridge.hpp +1 -1
- package/nitrogen/generated/ios/NitroAuth-Swift-Cxx-Umbrella.hpp +1 -1
- package/nitrogen/generated/ios/NitroAuthAutolinking.mm +1 -1
- package/nitrogen/generated/ios/NitroAuthAutolinking.swift +1 -1
- package/nitrogen/generated/shared/c++/AuthProvider.hpp +1 -1
- package/nitrogen/generated/shared/c++/AuthTokens.hpp +1 -1
- package/nitrogen/generated/shared/c++/AuthUser.hpp +1 -1
- package/nitrogen/generated/shared/c++/HybridAuthSpec.cpp +3 -1
- package/nitrogen/generated/shared/c++/HybridAuthSpec.hpp +7 -1
- package/nitrogen/generated/shared/c++/HybridAuthStorageAdapterSpec.cpp +23 -0
- package/nitrogen/generated/shared/c++/HybridAuthStorageAdapterSpec.hpp +65 -0
- package/nitrogen/generated/shared/c++/LoginOptions.hpp +7 -3
- package/package.json +1 -1
- package/react-native-nitro-auth.podspec +1 -1
- package/src/Auth.nitro.ts +5 -0
- package/src/Auth.web.ts +71 -11
- package/src/AuthStorage.nitro.ts +17 -0
- package/src/index.ts +1 -0
- package/src/index.web.ts +1 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/// HybridAuthSpec.cpp
|
|
3
3
|
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
4
|
/// https://github.com/mrousavy/nitro
|
|
5
|
-
/// Copyright ©
|
|
5
|
+
/// Copyright © 2026 Marc Rousavy @ Margelo
|
|
6
6
|
///
|
|
7
7
|
|
|
8
8
|
#include "HybridAuthSpec.hpp"
|
|
@@ -24,7 +24,9 @@ namespace margelo::nitro::NitroAuth {
|
|
|
24
24
|
prototype.registerHybridMethod("refreshToken", &HybridAuthSpec::refreshToken);
|
|
25
25
|
prototype.registerHybridMethod("logout", &HybridAuthSpec::logout);
|
|
26
26
|
prototype.registerHybridMethod("onAuthStateChanged", &HybridAuthSpec::onAuthStateChanged);
|
|
27
|
+
prototype.registerHybridMethod("onTokensRefreshed", &HybridAuthSpec::onTokensRefreshed);
|
|
27
28
|
prototype.registerHybridMethod("setLoggingEnabled", &HybridAuthSpec::setLoggingEnabled);
|
|
29
|
+
prototype.registerHybridMethod("setStorageAdapter", &HybridAuthSpec::setStorageAdapter);
|
|
28
30
|
});
|
|
29
31
|
}
|
|
30
32
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/// HybridAuthSpec.hpp
|
|
3
3
|
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
4
|
/// https://github.com/mrousavy/nitro
|
|
5
|
-
/// Copyright ©
|
|
5
|
+
/// Copyright © 2026 Marc Rousavy @ Margelo
|
|
6
6
|
///
|
|
7
7
|
|
|
8
8
|
#pragma once
|
|
@@ -21,6 +21,8 @@ namespace margelo::nitro::NitroAuth { enum class AuthProvider; }
|
|
|
21
21
|
namespace margelo::nitro::NitroAuth { struct LoginOptions; }
|
|
22
22
|
// Forward declaration of `AuthTokens` to properly resolve imports.
|
|
23
23
|
namespace margelo::nitro::NitroAuth { struct AuthTokens; }
|
|
24
|
+
// Forward declaration of `HybridAuthStorageAdapterSpec` to properly resolve imports.
|
|
25
|
+
namespace margelo::nitro::NitroAuth { class HybridAuthStorageAdapterSpec; }
|
|
24
26
|
|
|
25
27
|
#include "AuthUser.hpp"
|
|
26
28
|
#include <optional>
|
|
@@ -31,6 +33,8 @@ namespace margelo::nitro::NitroAuth { struct AuthTokens; }
|
|
|
31
33
|
#include "LoginOptions.hpp"
|
|
32
34
|
#include "AuthTokens.hpp"
|
|
33
35
|
#include <functional>
|
|
36
|
+
#include <memory>
|
|
37
|
+
#include "HybridAuthStorageAdapterSpec.hpp"
|
|
34
38
|
|
|
35
39
|
namespace margelo::nitro::NitroAuth {
|
|
36
40
|
|
|
@@ -72,7 +76,9 @@ namespace margelo::nitro::NitroAuth {
|
|
|
72
76
|
virtual std::shared_ptr<Promise<AuthTokens>> refreshToken() = 0;
|
|
73
77
|
virtual void logout() = 0;
|
|
74
78
|
virtual std::function<void()> onAuthStateChanged(const std::function<void(const std::optional<AuthUser>& /* user */)>& callback) = 0;
|
|
79
|
+
virtual std::function<void()> onTokensRefreshed(const std::function<void(const AuthTokens& /* tokens */)>& callback) = 0;
|
|
75
80
|
virtual void setLoggingEnabled(bool enabled) = 0;
|
|
81
|
+
virtual void setStorageAdapter(const std::optional<std::shared_ptr<HybridAuthStorageAdapterSpec>>& adapter) = 0;
|
|
76
82
|
|
|
77
83
|
protected:
|
|
78
84
|
// Hybrid Setup
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// HybridAuthStorageAdapterSpec.cpp
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © 2026 Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
#include "HybridAuthStorageAdapterSpec.hpp"
|
|
9
|
+
|
|
10
|
+
namespace margelo::nitro::NitroAuth {
|
|
11
|
+
|
|
12
|
+
void HybridAuthStorageAdapterSpec::loadHybridMethods() {
|
|
13
|
+
// load base methods/properties
|
|
14
|
+
HybridObject::loadHybridMethods();
|
|
15
|
+
// load custom methods/properties
|
|
16
|
+
registerHybrids(this, [](Prototype& prototype) {
|
|
17
|
+
prototype.registerHybridMethod("save", &HybridAuthStorageAdapterSpec::save);
|
|
18
|
+
prototype.registerHybridMethod("load", &HybridAuthStorageAdapterSpec::load);
|
|
19
|
+
prototype.registerHybridMethod("remove", &HybridAuthStorageAdapterSpec::remove);
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
} // namespace margelo::nitro::NitroAuth
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// HybridAuthStorageAdapterSpec.hpp
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © 2026 Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#if __has_include(<NitroModules/HybridObject.hpp>)
|
|
11
|
+
#include <NitroModules/HybridObject.hpp>
|
|
12
|
+
#else
|
|
13
|
+
#error NitroModules cannot be found! Are you sure you installed NitroModules properly?
|
|
14
|
+
#endif
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
#include <string>
|
|
19
|
+
#include <optional>
|
|
20
|
+
|
|
21
|
+
namespace margelo::nitro::NitroAuth {
|
|
22
|
+
|
|
23
|
+
using namespace margelo::nitro;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* An abstract base class for `AuthStorageAdapter`
|
|
27
|
+
* Inherit this class to create instances of `HybridAuthStorageAdapterSpec` in C++.
|
|
28
|
+
* You must explicitly call `HybridObject`'s constructor yourself, because it is virtual.
|
|
29
|
+
* @example
|
|
30
|
+
* ```cpp
|
|
31
|
+
* class HybridAuthStorageAdapter: public HybridAuthStorageAdapterSpec {
|
|
32
|
+
* public:
|
|
33
|
+
* HybridAuthStorageAdapter(...): HybridObject(TAG) { ... }
|
|
34
|
+
* // ...
|
|
35
|
+
* };
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
class HybridAuthStorageAdapterSpec: public virtual HybridObject {
|
|
39
|
+
public:
|
|
40
|
+
// Constructor
|
|
41
|
+
explicit HybridAuthStorageAdapterSpec(): HybridObject(TAG) { }
|
|
42
|
+
|
|
43
|
+
// Destructor
|
|
44
|
+
~HybridAuthStorageAdapterSpec() override = default;
|
|
45
|
+
|
|
46
|
+
public:
|
|
47
|
+
// Properties
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
public:
|
|
51
|
+
// Methods
|
|
52
|
+
virtual void save(const std::string& key, const std::string& value) = 0;
|
|
53
|
+
virtual std::optional<std::string> load(const std::string& key) = 0;
|
|
54
|
+
virtual void remove(const std::string& key) = 0;
|
|
55
|
+
|
|
56
|
+
protected:
|
|
57
|
+
// Hybrid Setup
|
|
58
|
+
void loadHybridMethods() override;
|
|
59
|
+
|
|
60
|
+
protected:
|
|
61
|
+
// Tag for logging
|
|
62
|
+
static constexpr auto TAG = "AuthStorageAdapter";
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
} // namespace margelo::nitro::NitroAuth
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/// LoginOptions.hpp
|
|
3
3
|
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
4
|
/// https://github.com/mrousavy/nitro
|
|
5
|
-
/// Copyright ©
|
|
5
|
+
/// Copyright © 2026 Marc Rousavy @ Margelo
|
|
6
6
|
///
|
|
7
7
|
|
|
8
8
|
#pragma once
|
|
@@ -38,10 +38,11 @@ namespace margelo::nitro::NitroAuth {
|
|
|
38
38
|
public:
|
|
39
39
|
std::optional<std::vector<std::string>> scopes SWIFT_PRIVATE;
|
|
40
40
|
std::optional<std::string> loginHint SWIFT_PRIVATE;
|
|
41
|
+
std::optional<bool> useOneTap SWIFT_PRIVATE;
|
|
41
42
|
|
|
42
43
|
public:
|
|
43
44
|
LoginOptions() = default;
|
|
44
|
-
explicit LoginOptions(std::optional<std::vector<std::string>> scopes, std::optional<std::string> loginHint): scopes(scopes), loginHint(loginHint) {}
|
|
45
|
+
explicit LoginOptions(std::optional<std::vector<std::string>> scopes, std::optional<std::string> loginHint, std::optional<bool> useOneTap): scopes(scopes), loginHint(loginHint), useOneTap(useOneTap) {}
|
|
45
46
|
};
|
|
46
47
|
|
|
47
48
|
} // namespace margelo::nitro::NitroAuth
|
|
@@ -55,13 +56,15 @@ namespace margelo::nitro {
|
|
|
55
56
|
jsi::Object obj = arg.asObject(runtime);
|
|
56
57
|
return margelo::nitro::NitroAuth::LoginOptions(
|
|
57
58
|
JSIConverter<std::optional<std::vector<std::string>>>::fromJSI(runtime, obj.getProperty(runtime, "scopes")),
|
|
58
|
-
JSIConverter<std::optional<std::string>>::fromJSI(runtime, obj.getProperty(runtime, "loginHint"))
|
|
59
|
+
JSIConverter<std::optional<std::string>>::fromJSI(runtime, obj.getProperty(runtime, "loginHint")),
|
|
60
|
+
JSIConverter<std::optional<bool>>::fromJSI(runtime, obj.getProperty(runtime, "useOneTap"))
|
|
59
61
|
);
|
|
60
62
|
}
|
|
61
63
|
static inline jsi::Value toJSI(jsi::Runtime& runtime, const margelo::nitro::NitroAuth::LoginOptions& arg) {
|
|
62
64
|
jsi::Object obj(runtime);
|
|
63
65
|
obj.setProperty(runtime, "scopes", JSIConverter<std::optional<std::vector<std::string>>>::toJSI(runtime, arg.scopes));
|
|
64
66
|
obj.setProperty(runtime, "loginHint", JSIConverter<std::optional<std::string>>::toJSI(runtime, arg.loginHint));
|
|
67
|
+
obj.setProperty(runtime, "useOneTap", JSIConverter<std::optional<bool>>::toJSI(runtime, arg.useOneTap));
|
|
65
68
|
return obj;
|
|
66
69
|
}
|
|
67
70
|
static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) {
|
|
@@ -74,6 +77,7 @@ namespace margelo::nitro {
|
|
|
74
77
|
}
|
|
75
78
|
if (!JSIConverter<std::optional<std::vector<std::string>>>::canConvert(runtime, obj.getProperty(runtime, "scopes"))) return false;
|
|
76
79
|
if (!JSIConverter<std::optional<std::string>>::canConvert(runtime, obj.getProperty(runtime, "loginHint"))) return false;
|
|
80
|
+
if (!JSIConverter<std::optional<bool>>::canConvert(runtime, obj.getProperty(runtime, "useOneTap"))) return false;
|
|
77
81
|
return true;
|
|
78
82
|
}
|
|
79
83
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-nitro-auth",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"description": "High-performance authentication library for React Native with Google Sign-In and Apple Sign-In support, powered by Nitro Modules (JSI)",
|
|
5
5
|
"main": "lib/commonjs/index.js",
|
|
6
6
|
"module": "lib/module/index.js",
|
package/src/Auth.nitro.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { HybridObject } from "react-native-nitro-modules";
|
|
2
2
|
|
|
3
|
+
import type { AuthStorageAdapter } from "./AuthStorage.nitro";
|
|
4
|
+
|
|
3
5
|
export type AuthProvider = "google" | "apple";
|
|
4
6
|
|
|
5
7
|
export type AuthErrorCode =
|
|
@@ -12,6 +14,7 @@ export type AuthErrorCode =
|
|
|
12
14
|
export interface LoginOptions {
|
|
13
15
|
scopes?: string[];
|
|
14
16
|
loginHint?: string;
|
|
17
|
+
useOneTap?: boolean;
|
|
15
18
|
}
|
|
16
19
|
|
|
17
20
|
export interface AuthTokens {
|
|
@@ -48,5 +51,7 @@ export interface Auth extends HybridObject<{ ios: "c++"; android: "c++" }> {
|
|
|
48
51
|
onAuthStateChanged(
|
|
49
52
|
callback: (user: AuthUser | undefined) => void
|
|
50
53
|
): () => void;
|
|
54
|
+
onTokensRefreshed(callback: (tokens: AuthTokens) => void): () => void;
|
|
51
55
|
setLoggingEnabled(enabled: boolean): void;
|
|
56
|
+
setStorageAdapter(adapter: AuthStorageAdapter | undefined): void;
|
|
52
57
|
}
|
package/src/Auth.web.ts
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type {
|
|
2
|
+
Auth,
|
|
3
|
+
AuthUser,
|
|
4
|
+
AuthProvider,
|
|
5
|
+
LoginOptions,
|
|
6
|
+
AuthTokens,
|
|
7
|
+
} from "./Auth.nitro";
|
|
8
|
+
import type { AuthStorageAdapter } from "./AuthStorage.nitro";
|
|
2
9
|
import { logger } from "./utils/logger";
|
|
3
10
|
|
|
4
11
|
const CACHE_KEY = "nitro_auth_user";
|
|
@@ -18,26 +25,47 @@ class AuthWeb implements Auth {
|
|
|
18
25
|
private _currentUser: AuthUser | undefined;
|
|
19
26
|
private _grantedScopes: string[] = [];
|
|
20
27
|
private _listeners: ((user: AuthUser | undefined) => void)[] = [];
|
|
28
|
+
private _tokenListeners: ((tokens: AuthTokens) => void)[] = [];
|
|
29
|
+
private _storageAdapter: AuthStorageAdapter | undefined;
|
|
21
30
|
|
|
22
31
|
constructor() {
|
|
23
|
-
|
|
32
|
+
this.loadFromCache();
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
private loadFromCache() {
|
|
36
|
+
const cached = this._storageAdapter
|
|
37
|
+
? this._storageAdapter.load(CACHE_KEY)
|
|
38
|
+
: localStorage.getItem(CACHE_KEY);
|
|
39
|
+
|
|
24
40
|
if (cached) {
|
|
25
41
|
try {
|
|
26
42
|
this._currentUser = JSON.parse(cached);
|
|
27
43
|
} catch {
|
|
28
|
-
|
|
44
|
+
this.removeFromCache(CACHE_KEY);
|
|
29
45
|
}
|
|
30
46
|
}
|
|
31
|
-
|
|
47
|
+
|
|
48
|
+
const scopes = this._storageAdapter
|
|
49
|
+
? this._storageAdapter.load(SCOPES_KEY)
|
|
50
|
+
: localStorage.getItem(SCOPES_KEY);
|
|
51
|
+
|
|
32
52
|
if (scopes) {
|
|
33
53
|
try {
|
|
34
54
|
this._grantedScopes = JSON.parse(scopes);
|
|
35
55
|
} catch {
|
|
36
|
-
|
|
56
|
+
this.removeFromCache(SCOPES_KEY);
|
|
37
57
|
}
|
|
38
58
|
}
|
|
39
59
|
}
|
|
40
60
|
|
|
61
|
+
private removeFromCache(key: string) {
|
|
62
|
+
if (this._storageAdapter) {
|
|
63
|
+
this._storageAdapter.remove(key);
|
|
64
|
+
} else {
|
|
65
|
+
localStorage.removeItem(key);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
41
69
|
get currentUser(): AuthUser | undefined {
|
|
42
70
|
return this._currentUser;
|
|
43
71
|
}
|
|
@@ -60,6 +88,13 @@ class AuthWeb implements Auth {
|
|
|
60
88
|
};
|
|
61
89
|
}
|
|
62
90
|
|
|
91
|
+
onTokensRefreshed(callback: (tokens: AuthTokens) => void): () => void {
|
|
92
|
+
this._tokenListeners.push(callback);
|
|
93
|
+
return () => {
|
|
94
|
+
this._tokenListeners = this._tokenListeners.filter((l) => l !== callback);
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
63
98
|
private notify() {
|
|
64
99
|
this._listeners.forEach((l) => l(this._currentUser));
|
|
65
100
|
}
|
|
@@ -103,7 +138,14 @@ class AuthWeb implements Auth {
|
|
|
103
138
|
this._grantedScopes = this._grantedScopes.filter(
|
|
104
139
|
(s) => !scopes.includes(s)
|
|
105
140
|
);
|
|
106
|
-
|
|
141
|
+
if (this._storageAdapter) {
|
|
142
|
+
this._storageAdapter.save(
|
|
143
|
+
SCOPES_KEY,
|
|
144
|
+
JSON.stringify(this._grantedScopes)
|
|
145
|
+
);
|
|
146
|
+
} else {
|
|
147
|
+
localStorage.setItem(SCOPES_KEY, JSON.stringify(this._grantedScopes));
|
|
148
|
+
}
|
|
107
149
|
if (this._currentUser) {
|
|
108
150
|
this._currentUser.scopes = this._grantedScopes;
|
|
109
151
|
this.updateUser(this._currentUser);
|
|
@@ -132,10 +174,12 @@ class AuthWeb implements Auth {
|
|
|
132
174
|
await this.loginGoogle(
|
|
133
175
|
this._grantedScopes.length > 0 ? this._grantedScopes : DEFAULT_SCOPES
|
|
134
176
|
);
|
|
135
|
-
|
|
177
|
+
const tokens = {
|
|
136
178
|
accessToken: this._currentUser.accessToken,
|
|
137
179
|
idToken: this._currentUser.idToken,
|
|
138
180
|
};
|
|
181
|
+
this._tokenListeners.forEach((l) => l(tokens));
|
|
182
|
+
return tokens;
|
|
139
183
|
}
|
|
140
184
|
|
|
141
185
|
private mapError(error: unknown): Error {
|
|
@@ -227,7 +271,11 @@ class AuthWeb implements Auth {
|
|
|
227
271
|
|
|
228
272
|
if (idToken) {
|
|
229
273
|
this._grantedScopes = scopes;
|
|
230
|
-
|
|
274
|
+
if (this._storageAdapter) {
|
|
275
|
+
this._storageAdapter.save(SCOPES_KEY, JSON.stringify(scopes));
|
|
276
|
+
} else {
|
|
277
|
+
localStorage.setItem(SCOPES_KEY, JSON.stringify(scopes));
|
|
278
|
+
}
|
|
231
279
|
|
|
232
280
|
const user: AuthUser = {
|
|
233
281
|
provider: "google",
|
|
@@ -315,14 +363,18 @@ class AuthWeb implements Auth {
|
|
|
315
363
|
logout(): void {
|
|
316
364
|
this._currentUser = undefined;
|
|
317
365
|
this._grantedScopes = [];
|
|
318
|
-
|
|
319
|
-
|
|
366
|
+
this.removeFromCache(CACHE_KEY);
|
|
367
|
+
this.removeFromCache(SCOPES_KEY);
|
|
320
368
|
this.notify();
|
|
321
369
|
}
|
|
322
370
|
|
|
323
371
|
private updateUser(user: AuthUser) {
|
|
324
372
|
this._currentUser = user;
|
|
325
|
-
|
|
373
|
+
if (this._storageAdapter) {
|
|
374
|
+
this._storageAdapter.save(CACHE_KEY, JSON.stringify(user));
|
|
375
|
+
} else {
|
|
376
|
+
localStorage.setItem(CACHE_KEY, JSON.stringify(user));
|
|
377
|
+
}
|
|
326
378
|
this.notify();
|
|
327
379
|
}
|
|
328
380
|
|
|
@@ -330,6 +382,14 @@ class AuthWeb implements Auth {
|
|
|
330
382
|
logger.setEnabled(enabled);
|
|
331
383
|
}
|
|
332
384
|
|
|
385
|
+
setStorageAdapter(adapter: AuthStorageAdapter | undefined): void {
|
|
386
|
+
this._storageAdapter = adapter;
|
|
387
|
+
if (adapter) {
|
|
388
|
+
this.loadFromCache();
|
|
389
|
+
this.notify();
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
|
|
333
393
|
name = "Auth";
|
|
334
394
|
dispose() {}
|
|
335
395
|
equals(other: any) {
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { HybridObject } from "react-native-nitro-modules";
|
|
2
|
+
|
|
3
|
+
export interface AuthStorageAdapter
|
|
4
|
+
extends HybridObject<{ ios: "c++"; android: "c++" }> {
|
|
5
|
+
/**
|
|
6
|
+
* Called to save a value to the custom storage.
|
|
7
|
+
*/
|
|
8
|
+
save(key: string, value: string): void;
|
|
9
|
+
/**
|
|
10
|
+
* Called to load a value from the custom storage.
|
|
11
|
+
*/
|
|
12
|
+
load(key: string): string | undefined;
|
|
13
|
+
/**
|
|
14
|
+
* Called to remove a value from the custom storage.
|
|
15
|
+
*/
|
|
16
|
+
remove(key: string): void;
|
|
17
|
+
}
|
package/src/index.ts
CHANGED