unioil-loyalty-rn-app/app/components/storage/index.js

433 lines
14 KiB
JavaScript

import * as React from 'react';
import AsyncStorage from '@react-native-async-storage/async-storage';
import DeviceInfo from 'react-native-device-info';
import URL from '../api/endpoints.js';
const DBName = "@UnioilLoyaltyApp_";
export const get = async (key) => {
try {
const result = await AsyncStorage.getItem(DBName + key);
return result ? JSON.parse(result) : null;
} catch (error) {
console.error(`AsyncStorage get error for key ${key}:`, error);
return null;
}
};
export const set = async (key, data, onSuccess, onError) => {
try {
const stringData = JSON.stringify(data);
await AsyncStorage.setItem(DBName + key, stringData);
onSuccess?.();
} catch (error) {
console.error(`AsyncStorage set error for key ${key}:`, error);
onError?.(error);
}
};
export const reset = async () => {
try{
await AsyncStorage.removeItem(DBName + "iqair");
await AsyncStorage.removeItem(DBName + "pumpPaymentCards");
await AsyncStorage.removeItem(DBName + "topupPaymentCards");
await AsyncStorage.setItem(DBName + "session", JSON.stringify([]))
await AsyncStorage.setItem(DBName + "token", JSON.stringify([]))
await AsyncStorage.setItem(DBName + "accounts", JSON.stringify([]))
await AsyncStorage.removeItem(DBName + "enter_mpin")
await AsyncStorage.removeItem(DBName + "set_mpin")
await AsyncStorage.removeItem(DBName + "is_token_register")
await AsyncStorage.removeItem(DBName + "notifications")
}catch(error){
return false
}
}
export const resetSwitchAccount = async () => {
try {
await AsyncStorage.removeItem(DBName + "iqair");
await AsyncStorage.removeItem(DBName + "pumpPaymentCards");
await AsyncStorage.removeItem(DBName + "topupPaymentCards");
}catch(error) {
return false
}
}
export const session = async () => {
try {
const s = await AsyncStorage.getItem(DBName + "session")
const t = await AsyncStorage.getItem(DBName + "token")
let sessions = typeof s == 'string' ? JSON.parse(s) : []
let tokens = typeof t == 'string' ? JSON.parse(t) : []
let session = sessions.length > 0 ? sessions[sessions.length > 0 ? 0 : sessions.length] : sessions.pop()
let token = tokens.filter(function(item){ return item.card_number == session.card_number }).map(function(item){ return item })[0].token
return {user: session, token: token && token.includes("Bearer ") ? token : "Bearer " + token}
} catch (error) {
return error
}
}
export const login = async (data, onSuccess, onError) => {
try{
await AsyncStorage.removeItem(DBName + "is_guest")
const d1 = await AsyncStorage.getItem(DBName + "session")
const d2 = await AsyncStorage.getItem(DBName + "token")
let sessions = typeof d1 == 'string' ? JSON.parse(d1) : []
let tokens = typeof d2 == 'string' ? JSON.parse(d2) : []
if(sessions && tokens){
let filteredSessions = sessions.filter(function(item){
return item.card_number != data.session.card_number
}).map(function(item){
return item
})
let filteredTokens = tokens.filter(function(item){
return item.card_number != data.session.card_number
}).map(function(item){
return item
})
filteredSessions.splice(0, 0, {card_number: data.session.card_number, lcard_uuid: data.session.lcard_uuid, mobile_number: data.session.mobile})
filteredTokens.splice(0, 0, {token: data.token, card_number: data.session.card_number})
const res_sessions = await AsyncStorage.setItem(DBName + "session", JSON.stringify(filteredSessions))
const res_tokens = await AsyncStorage.setItem(DBName + "token", JSON.stringify(filteredTokens))
onSuccess({res_sessions, res_tokens})
return {res_sessions, res_tokens}
}
}catch(error){
onError(error)
return error
}
}
export const setsession = async (data, onSuccess, onError) => {
try{
const d1 = await AsyncStorage.getItem(DBName + "session")
let sessions = typeof d1 == 'string' ? JSON.parse(d1) : []
if(sessions){
var filteredSessions = sessions.filter(function(item){
return item.card_number != data.card_number;
}).map(function(item){
return item
})
filteredSessions.splice(0, 0, data)
const res = await AsyncStorage.setItem(DBName + "session", JSON.stringify(filteredSessions))
onSuccess(res)
}
}catch(error){
onError(error)
}
}
export const addsession = async (data, onSuccess, onError) => {
try{
const acts = await AsyncStorage.getItem(DBName + "session")
let json = acts ? JSON.parse(acts) : []
if(json){
json.push(data)
let res = await AsyncStorage.setItem(DBName + 'session', JSON.stringify(json))
onSuccess(res)
}
}catch(error){
onError(error)
}
}
export const settoken = async (data, onSuccess, onError) => {
try{
const d1 = await AsyncStorage.getItem(DBName + "token")
let tokens = typeof d1 == 'string' ? JSON.parse(d1) : []
if(tokens){
tokens.push(data)
const res = await AsyncStorage.setItem(DBName + "token", JSON.stringify(tokens))
onSuccess(res)
}
}catch(error){
onError(error)
}
}
export const accounts = async () => {
try{
const ss = await AsyncStorage.getItem(DBName + "session")
const acts = await AsyncStorage.getItem(DBName + "accounts")
let json = typeof acts == 'string' ? JSON.parse(acts) : acts
let sessions = typeof ss == 'string' ? JSON.parse(ss) : ss
let accounts = []
for(var i=0;i<sessions.length;i++){
for(var x=0;x<json.length;x++){
if(sessions[i].card_number == json[x].data.card_number) accounts[i] = json[x]
}
}
return json
}catch(error){
return error
}
}
export const removeAccount = async (account, successCallback, errorCallback) => {
try {
const ss = await AsyncStorage.getItem(DBName + "session")
const acts = await AsyncStorage.getItem(DBName + "accounts")
const t = await AsyncStorage.getItem(DBName + "token")
let json = typeof acts == 'string' ? JSON.parse(acts) : acts
let sessions = typeof ss == 'string' ? JSON.parse(ss) : ss
let tokens = typeof t == 'string' ? JSON.parse(t) : t
json = json.filter(function(item){
return item.data.card_number != account.data.card_number;
}).map(function(item){
return item
})
sessions = sessions.filter(function(item){
return item.card_number != account.data.card_number
}).map(function(item){
return item
})
tokens = tokens.filter(function(item){
return item.card_number != account.data.card_number
}).map(function(item){
return item
})
await AsyncStorage.setItem(DBName + 'session', JSON.stringify(sessions))
await AsyncStorage.setItem(DBName + 'accounts', JSON.stringify(json))
await AsyncStorage.setItem(DBName + 'token', JSON.stringify(tokens))
successCallback()
} catch (error) {
errorCallback()
}
}
export const addaccount = async (data, onSuccess, onError) => {
try{
const acts = await AsyncStorage.getItem(DBName + "accounts")
let json = acts ? JSON.parse(acts) : []
if(json){
var filteredJson = json.filter(function(item){
return item.data.card_number != data.data.card_number;
}).map(function(item){
return item
})
filteredJson.splice(0, 0, data)
let response = await AsyncStorage.setItem(DBName + 'accounts', JSON.stringify(filteredJson))
onSuccess(response)
}
}catch(error){
onError(error)
}
}
export const profile = async () => {
try{
const acts = await AsyncStorage.getItem(DBName + "accounts")
let json = acts ? JSON.parse(acts) : []
return json.length > 0 ? json[json.length > 0 ? 0 : json.length] : json.pop()
// return json.pop()
}catch(error){
return error
}
}
export const updateProfile = async (data, onSuccess, onError) => {
try{
const acts = await AsyncStorage.getItem(DBName + "accounts")
const ss = await AsyncStorage.getItem(DBName + "session")
const t = await AsyncStorage.getItem(DBName + "token")
let accounts = typeof acts == 'string' ? JSON.parse(acts) : acts
let sessions = typeof ss == 'string' ? JSON.parse(ss) : ss
let tokens = typeof t == 'string' ? JSON.parse(t) : t
var filteredAccounts = accounts.filter(function(item){
return item.data.card_number != data.data.card_number;
}).map(function(item){
return item
})
var filteredSessions = sessions.filter(function(item){
return item.card_number != data.data.card_number;
}).map(function(item){
return item
})
let filteredTokens = tokens.filter(function(item){
return item.card_number != data.data.card_number
}).map(function(item){
return item
})
//get the token for saving to first index of array
let token = tokens.filter(function(item){
return item.card_number == data.data.card_number
}).map(function(item){
return item
})[0].token
filteredAccounts.splice(0, 0, data)
filteredSessions.splice(0, 0, {card_number: data.data.card_number, lcard_uuid: data.data.lcard_uuid, mobile_number: data.data.mobile})
filteredTokens.splice(0, 0, {token: token, card_number: data.data.card_number})
await AsyncStorage.setItem(DBName + 'accounts', JSON.stringify(filteredAccounts))
await AsyncStorage.setItem(DBName + 'session', JSON.stringify(filteredSessions))
await AsyncStorage.setItem(DBName + 'token', JSON.stringify(filteredTokens))
onSuccess()
} catch(error) {
onError(error)
}
}
export const AddNotification = async (notification) => {
try{
let notifications = []
const allNotifs = await AsyncStorage.getItem(DBName + "notifications")
if(!allNotifs){
notifications.push(notification)
let result = await AsyncStorage.setItem(DBName + "notifications", JSON.stringify(notifications))
return "Notification successfully added"
}else{
notifications = JSON.parse(allNotifs)
notifications.push(notification)
let result = await AsyncStorage.setItem(DBName + "notifications", JSON.stringify(notifications))
return "Notification successfully added"
}
}catch(e){
return e
}
}
export const remove = async (key) => {
try{
const result = await AsyncStorage.removeItem(DBName + key)
}catch(e){
return e
}
}
export const switchaccount = async (index, cn) => {
const acts = await AsyncStorage.getItem(DBName + "accounts")
const ss = await AsyncStorage.getItem(DBName + "session")
const t = await AsyncStorage.getItem(DBName + "token")
let accounts = typeof acts == 'string' ? JSON.parse(acts) : acts
let sessions = typeof ss == 'string' ? JSON.parse(ss) : ss
let tokens = typeof t == 'string' ? JSON.parse(t) : t
var mainAccount = accounts.filter(function(item){
return item.data.card_number == cn;
}).map(function(item){
return item
})[0]
var filteredAccounts = accounts.filter(function(item){
return item.data.card_number != cn;
}).map(function(item){
return item
})
var filteredSessions = sessions.filter(function(item){
return item.card_number != cn;
}).map(function(item){
return item
})
let filteredTokens = tokens.filter(function(item){
return item.card_number != cn
}).map(function(item){
return item
})
//get the token for saving to first index of array
let token = tokens.filter(function(item){
return item.card_number == cn
}).map(function(item){
return item
})[0].token
filteredAccounts.splice(0, 0, mainAccount)
filteredSessions.splice(0, 0, {card_number: mainAccount.data.card_number, lcard_uuid: mainAccount.data.lcard_uuid, mobile_number: mainAccount.data.mobile})
filteredTokens.splice(0, 0, {token: token, card_number: cn})
await AsyncStorage.setItem(DBName + 'accounts', JSON.stringify(filteredAccounts))
await AsyncStorage.setItem(DBName + 'session', JSON.stringify(filteredSessions))
await AsyncStorage.setItem(DBName + 'token', JSON.stringify(filteredTokens))
return true
}
export const setLogin = async () => {
await AsyncStorage.setItem(DBName + "isLogin", JSON.stringify({isLogin: true}))
}
export const logoutAccount = async (callback, catcher) => {
try{
await AsyncStorage.setItem(DBName + "enter_mpin", "false")
callback()
} catch(error) {
catcher(error, 0)
}
}
export const logout = async (callback, catcher) => {
try{
const tokens = await AsyncStorage.getItem(DBName + "token")
const ss = await AsyncStorage.getItem(DBName + "session")
const acts = await AsyncStorage.getItem(DBName + "accounts")
let tk = typeof tokens == "string" ? JSON.parse(tokens) : tokens
let sessions = typeof ss == 'string' ? JSON.parse(ss) : ss
let accounts = typeof acts == 'string' ? JSON.parse(acts) : acts
let token = tk[tk.length > 0 ? tk.length - 1 : tk.length]
fetch(URL.logout, {
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
Authorization: typeof token == 'string' && token?.includes("Bearer ") ? token : "Bearer " + token
},
body: {},
}).then(response => response.json())
.then(async (data) => {
sessions.splice(sessions.length - 1, 1)
tk.splice(tk.length - 1, 1)
accounts.splice(accounts.length - 1, 1)
await AsyncStorage.setItem(DBName + "session", JSON.stringify(sessions))
await AsyncStorage.setItem(DBName + "token", JSON.stringify(tk))
await AsyncStorage.setItem(DBName + "accounts", JSON.stringify(accounts))
// await AsyncStorage.removeItem(DBName + "session")
// await AsyncStorage.removeItem(DBName + "token")
callback(data, tk.length)
});
}catch(error){
await AsyncStorage.setItem(DBName + "session", JSON.stringify([]))
await AsyncStorage.setItem(DBName + "token", JSON.stringify([]))
await AsyncStorage.setItem(DBName + "accounts", JSON.stringify([]))
callback(error, 0)
}
}
export default {
get,
set,
session,
logout,
logoutAccount,
AddNotification,
remove,
login,
accounts,
removeAccount,
profile,
updateProfile,
settoken,
setsession,
addsession,
addaccount,
reset,
resetSwitchAccount,
switchaccount
}