@boneframework/native-components 1.0.0 → 1.0.2

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 CHANGED
@@ -1,4 +1,9 @@
1
1
  # @boneframework/native-components
2
- React Native expo components for BoneFramework
2
+ React Native expo components for BoneFramework WIP
3
+ ## project level files referred to in code
4
+ ```
5
+ @/config/settings
6
+ @/config/cache
7
+ ```
3
8
 
4
9
 
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@boneframework/native-components",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "Expo Components for Bone Framework",
5
- "main": "index.js",
5
+ "main": "src/Bone.ts",
6
6
  "scripts": {
7
7
  "test": "echo \"Error: no test specified\" && exit 1"
8
8
  },
@@ -25,5 +25,14 @@
25
25
  "url": "https://github.com/boneframework/native-components/issues"
26
26
  },
27
27
  "homepage": "https://github.com/boneframework/native-components#readme",
28
- "publishConfig": {"access": "public"}
28
+ "publishConfig": {
29
+ "access": "public"
30
+ },
31
+ "dependencies": {
32
+ "@react-native-async-storage/async-storage": "^1.24.0",
33
+ "apisauce": "^3.0.1",
34
+ "expo-secure-store": "^13.0.2",
35
+ "jwt-decode": "^4.0.0",
36
+ "react": "18.2.0"
37
+ }
29
38
  }
package/src/Bone.ts ADDED
@@ -0,0 +1,6 @@
1
+ import Components from "./Components";
2
+ import Hooks from "./Hooks";
3
+ import Screens from "./Screens";
4
+ import Utilities from "./Utilities";
5
+
6
+ export default {Components, Hooks, Screens, Utilities}
@@ -0,0 +1 @@
1
+ export default {}
@@ -0,0 +1 @@
1
+ export default {}
package/src/Hooks.ts ADDED
@@ -0,0 +1,3 @@
1
+ import useAuth from './hooks/useAuth';
2
+
3
+ export default { useAuth }
package/src/Screens.ts ADDED
@@ -0,0 +1 @@
1
+ export default {}
@@ -0,0 +1 @@
1
+ export default {}
@@ -0,0 +1,29 @@
1
+ import {create} from 'apisauce';
2
+
3
+ import cache from '../utilities/cache';
4
+ import settings from '@/config/settings';
5
+ import cacheSettings from '@/config/cache';
6
+
7
+ const apiClient = create({
8
+ baseURL: settings.apiUrl
9
+ });
10
+
11
+ const get = apiClient.get;
12
+
13
+ apiClient.get = async (url, params, axiosConfig) => {
14
+ const response = await get(url, params, axiosConfig);
15
+
16
+ if (response.ok) {
17
+ if (cacheSettings.blacklist.includes(url) === false) {
18
+ cache.store(url, response.data);
19
+ }
20
+
21
+ return response;
22
+ }
23
+
24
+ const data = await cache.get(url);
25
+
26
+ return data ? {ok: true, data: data} : response;
27
+ }
28
+
29
+ export default apiClient;
@@ -0,0 +1,7 @@
1
+ import client from './client';
2
+
3
+ const register = pushToken => client.post('/api/notifications/register-token', {token: pushToken});
4
+
5
+ export default {
6
+ register,
7
+ }
@@ -0,0 +1,9 @@
1
+ import client from './client';
2
+
3
+ const send = (message, data) => {
4
+ return client.post('/api/notifications/send-notification', {message, data})
5
+ };
6
+
7
+ export default {
8
+ send
9
+ };
@@ -0,0 +1,9 @@
1
+ import apiClient from './client'
2
+
3
+ const endpoint = '/ping';
4
+
5
+ const ping = () => apiClient.get(endpoint);
6
+
7
+ export default {
8
+ ping
9
+ }
@@ -0,0 +1,35 @@
1
+ import client from './client';
2
+
3
+ const activateAccount = (email, token, clientId, password) => client.post('/api/user/activate', {email: email, token: token, clientId: clientId, password: password});
4
+ const getProfile = token => client.get('/api/user/profile', {}, {
5
+ headers: { 'Authorization': 'Bearer ' + token},
6
+ });
7
+ const register = userInfo => client.post('/api/user/register', userInfo);
8
+ const resendactivationEmail = email => client.post('/api/user/resend-activation-email', {email: email});
9
+ const updateProfile = profileInfo => client.put('/api/user/profile', profileInfo);
10
+ const validateEmailToken = (email, token) => client.post('/api/user/validate-email-token', {email: email, token: token});
11
+ const uploadUserImage = formData => client.post('/api/user/image', formData, {
12
+ headers: { 'Content-Type': 'multipart/form-data'},
13
+ });
14
+ const userImage = () => client.get('/api/user/image');
15
+ const userSettings = () => client.get('/api/user/settings');
16
+ const updateUserSettings = settings => client.put('/api/user/settings', settings);
17
+ const uploadUserBackgroundImage = formData => client.post('/api/user/background-image', formData, {
18
+ headers: { 'Content-Type': 'multipart/form-data' },
19
+ });
20
+ const userBackgroundImage = () => client.get('/api/user/background-image');
21
+
22
+ export default {
23
+ activateAccount,
24
+ getProfile,
25
+ register,
26
+ resendactivationEmail,
27
+ updateProfile,
28
+ uploadUserImage,
29
+ uploadUserBackgroundImage,
30
+ userBackgroundImage,
31
+ userImage,
32
+ userSettings,
33
+ updateUserSettings,
34
+ validateEmailToken
35
+ };
@@ -0,0 +1,31 @@
1
+ import React, {useState} from 'react';
2
+
3
+ import AuthContext from "../contexts/auth";
4
+ import useAuth from "../hooks/useAuth";
5
+
6
+ function SessionProvider(props: object) {
7
+ const [user, setUser] = useState(null);
8
+ const auth = useAuth();
9
+ setUser(auth.user);
10
+
11
+ return (
12
+ <AuthContext.Provider
13
+ value={{
14
+ signIn: async (authToken: string) => {
15
+ auth.login(authToken);
16
+ setUser(auth.user);
17
+ },
18
+ signOut: () => {
19
+ auth.logout();
20
+ setUser(null);
21
+ },
22
+ user,
23
+ }}>
24
+ {props.children}
25
+ </AuthContext.Provider>
26
+ )
27
+ }
28
+
29
+
30
+
31
+ export default SessionProvider;
@@ -0,0 +1,5 @@
1
+ import React from "react";
2
+
3
+ const AuthContext = React.createContext();
4
+
5
+ export default AuthContext;
@@ -0,0 +1,37 @@
1
+ import {useContext} from "react";
2
+
3
+ import AuthContext from "../contexts/auth";
4
+ import authStorage from "../utilities/authStorage";
5
+ import useApi from "./useApi";
6
+ import usersApi from "../api/users";
7
+
8
+ export default useAuth = () => {
9
+ const profileApi = useApi(usersApi.getProfile);
10
+ const {user, setUser} = useContext(AuthContext);
11
+
12
+ const login = async authToken => {
13
+ // possibly don't wait here?
14
+ await authStorage.storeAuthToken(authToken).then(async () => {
15
+ const user = await profileApi.request(authToken);
16
+ authStorage.storeUser(user.data);
17
+ user.data.authToken = authToken;
18
+ setUser(user.data);
19
+ });
20
+ }
21
+
22
+ const updateUser = async user => {
23
+ const authToken = user.authToken;
24
+ await delete user.authToken;
25
+ authStorage.storeUser(user);
26
+ user.authToken = authToken;
27
+ setUser({...user});
28
+ }
29
+
30
+ const logout = () => {
31
+ setUser(null);
32
+ authStorage.removeAuthToken();
33
+ authStorage.removeUser();
34
+ }
35
+
36
+ return {login, logout, updateUser, user};
37
+ }
@@ -0,0 +1,80 @@
1
+ import * as SecureStore from 'expo-secure-store';
2
+ import AsyncStorage from "@react-native-async-storage/async-storage";
3
+ import jwtDecode from 'jwt-decode';
4
+
5
+ const userKey = 'user';
6
+ const tokenKey = 'authToken';
7
+
8
+ const getUser = async () => {
9
+ return await fetch(userKey);
10
+ };
11
+
12
+ const storeUser = user => {
13
+ store(userKey, user, 'error storing the user');
14
+ };
15
+
16
+ const storeAuthToken = async token => {
17
+ await storeSecure(tokenKey, token, 'error storing the auth token');
18
+ };
19
+
20
+ const getAuthToken = async () => {
21
+ return await fetchSecure(tokenKey);
22
+ };
23
+
24
+ const removeAuthToken = () => {
25
+ removeSecure(tokenKey);
26
+ }
27
+
28
+ const removeUser = () => {
29
+ remove(userKey);
30
+ }
31
+
32
+ const removeSecure = async key => {
33
+ try {
34
+ await SecureStore.deleteItemAsync(key);
35
+ } catch (error) {
36
+ console.error('error removing ' + key + ' from storage', error);
37
+ }
38
+ }
39
+
40
+ const storeSecure = async (key, value, errorMessage = 'error storing value') => {
41
+ try {
42
+ await SecureStore.setItemAsync(key, JSON.stringify(value));
43
+ } catch (error) {
44
+ console.error(errorMessage, error);
45
+ }
46
+ }
47
+
48
+ const fetchSecure = async key => {
49
+ try {
50
+ return JSON.parse(await SecureStore.getItemAsync(key));
51
+ } catch (error) {
52
+ console.error('error fetcghing storage key ' + key, error);
53
+ }
54
+ }
55
+
56
+ const store = async (key, value, errorMessage = 'error storing value') => {
57
+ try {
58
+ await AsyncStorage.setItem(key, JSON.stringify(value));
59
+ } catch (error) {
60
+ console.error(errorMessage, error);
61
+ }
62
+ }
63
+
64
+ const fetch = async key => {
65
+ try {
66
+ return JSON.parse(await AsyncStorage.getItem(key));
67
+ } catch (error) {
68
+ console.error('error fetcghing storage key ' + key, error);
69
+ }
70
+ }
71
+
72
+ const remove = async key => {
73
+ try {
74
+ await AsyncStorage.removeItem(key);
75
+ } catch (error) {
76
+ console.error('error removing ' + key + ' from storage', error);
77
+ }
78
+ }
79
+
80
+ export default { getAuthToken, getUser, removeAuthToken, removeUser, storeAuthToken, storeUser };