alpha
Jan Umbach 2023-02-08 22:01:06 +01:00
parent 468c5bbff6
commit 31bf860d84
15 changed files with 206 additions and 50 deletions

View File

@ -30,26 +30,36 @@ function onAppStart() {
BigDataManager.initDatabase() BigDataManager.initDatabase()
.then(async () => { .then(async () => {
console.log('finish'); console.log('finish');
await BigDataManager.setEntry('users', { await BigDataManager.databases.users.setEntry({
UserId: 'test', UserId: 'test',
AccountName: 'test222222222', AccountName: 'test222222222',
Username: 'us', Username: 'us',
Description: 'daw',
FollowersCount: 2,
FollowingCount: 24,
lastUpdateTimestamp: 412341234,
ProfilePicture: '',
ProfilePictureBinaryHQ: new ArrayBuffer(0),
ProfilePictureBinaryLQ: new ArrayBuffer(0),
XpLevel: 0,
XpPoints: 0,
}); });
setTimeout(async () => { setTimeout(async () => {
console.log('get'); console.log('get');
const obj = await BigDataManager.databases.users.getEntry('test'); const obj = await BigDataManager.databases.users.getEntry('test');
console.log('obj', obj);
console.log('objAccName', obj?.AccountName); //await UserManager.getUser(MyUserManager.getSelectedUserId());
console.log(
'user', //await UserManager.getUser('ce97da21-c5f1-46f8-947b-ce9288b74ed1');
await UserManager.getUser(MyUserManager.getSelectedUserId()), }, 4100);
); setTimeout(async () => {
console.log( console.log('get');
'user2', const obj = await BigDataManager.databases.users.getEntry('test');
await UserManager.getUser('ce97da21-c5f1-46f8-947b-ce9288b74ed1'),
); //await UserManager.getUser(MyUserManager.getSelectedUserId());
}, 1100); //await UserManager.getUser('7396bd88-fe36-4e2e-9810-a83b33440ab6');
}, 2100);
store.dispatch( store.dispatch(
appNonSaveVarActions.setAppStatus(appStatus.APP_RUNNING), appNonSaveVarActions.setAppStatus(appStatus.APP_RUNNING),

View File

@ -1,5 +1,56 @@
import {Center} from 'native-base'; import {UserId} from '@caj/configs/types';
import {RootState} from '@caj/redux/store';
import MyUserManager from '@caj/user/MyUserManager';
import UserManager from '@caj/user/UserManager';
import {Center, Skeleton} from 'native-base';
import {useSelector} from 'react-redux';
// 7396bd88-fe36-4e2e-9810-a83b33440ab6
function Test() {
/*UserManager.getUser(uuid).then(user => {
//console.log(user);
});*/
const myUser = UserManager.getUserSelector(MyUserManager.getSelectedUserId());
console.log('reload', myUser);
if (myUser === undefined) {
return (
<Center width={300}>
<Skeleton.Text lines={1} px="12" />
</Center>
);
}
return <Center>{myUser.Username.data}</Center>;
}
function Test2() {
const uuid = 'ce97da21-c5f1-46f8-947b-ce9288b74ed1';
/*UserManager.getUser(uuid).then(user => {
//console.log(user);
});*/
const myUser = UserManager.getUserSelector(uuid);
console.log('reload', myUser);
if (myUser === undefined) {
return <Center>undefined</Center>;
}
return <Center>{myUser.AccountName.data}</Center>;
}
export default function AccountInfoBanner() { export default function AccountInfoBanner() {
return <Center>Account</Center>; return (
<Center>
Account
<Test />
<Test2 />
</Center>
);
} }

View File

@ -1,9 +1,12 @@
//these variables should not changed by the user and will not be saved in storage //these variables should not changed by the user and will not be saved in storage
import {getVersionByNum, VersionType} from '@caj/helper/version'; import {getVersionByNum, VersionType} from '@caj/helper/version';
import {User} from '@caj/user/types';
import {UserId} from './types';
export const APP_VERSION = getVersionByNum(2); export const APP_VERSION = getVersionByNum(2);
export const AppVarMaxBackups: number = 10; export const AppVarMaxBackups: number = 10;
export const maxCachedUsers = 30;
export enum appStatus { export enum appStatus {
IS_LOADING, IS_LOADING,
@ -21,10 +24,12 @@ export interface NON_SAVE_VARS {
currentAppVersion: VersionType; currentAppVersion: VersionType;
appStatus: appStatus; appStatus: appStatus;
connectionStatus: connectionStatus; connectionStatus: connectionStatus;
cachedUsers: {[key: UserId]: User};
} }
export const non_save_vars: NON_SAVE_VARS = { export const non_save_vars: NON_SAVE_VARS = {
currentAppVersion: APP_VERSION, currentAppVersion: APP_VERSION,
appStatus: appStatus.IS_LOADING, appStatus: appStatus.IS_LOADING,
connectionStatus: connectionStatus.UNKNOWN, connectionStatus: connectionStatus.UNKNOWN,
cachedUsers: {},
}; };

View File

@ -2,6 +2,8 @@ import {createSlice} from '@reduxjs/toolkit';
import type {PayloadAction} from '@reduxjs/toolkit'; import type {PayloadAction} from '@reduxjs/toolkit';
import {appStatus, non_save_vars} from './appNonSaveVar'; import {appStatus, non_save_vars} from './appNonSaveVar';
import {User} from '@caj/user/types';
import {UserId} from './types';
export const appNonSaveVariablesSlice = createSlice({ export const appNonSaveVariablesSlice = createSlice({
name: 'non_save_vars', name: 'non_save_vars',
@ -10,6 +12,12 @@ export const appNonSaveVariablesSlice = createSlice({
setAppStatus: (state, action: PayloadAction<appStatus>) => { setAppStatus: (state, action: PayloadAction<appStatus>) => {
state.appStatus = action.payload; state.appStatus = action.payload;
}, },
setCachedUser: (state, action: PayloadAction<User>) => {
state.cachedUsers[action.payload.UserId] = action.payload;
},
removeCachedUser: (state, action: PayloadAction<UserId>) => {
delete state.cachedUsers[action.payload];
},
}, },
}); });

View File

@ -1,15 +1,14 @@
import DBSchemas from './schemas';
import {getDatabase} from './getDB'; import {getDatabase} from './getDB';
import {databaseConf, databaseNames, possibleDBKeys} from './types'; import {databaseConf, possibleDBKeys} from './types';
export const getEntry = async <T2 extends databaseConf<T>, T>( export const getEntry = async <T2 extends databaseConf<T>, T>(
db: T2, schema: T2,
key: possibleDBKeys, key: possibleDBKeys,
): Promise<null | T> => { ): Promise<null | T> => {
const dbName = db.details.name; const dbName = schema.details.name;
const realm = await getDatabase(dbName); const realm = await getDatabase(dbName);
const val = realm.objectForPrimaryKey<typeof db.details.properties>( const val = realm.objectForPrimaryKey<typeof schema.details.properties>(
dbName, dbName,
key, key,
); );

View File

@ -1,12 +1,13 @@
import MyUserManager from '@caj/user/MyUserManager';
import {getDatabase} from './getDB.web'; import {getDatabase} from './getDB.web';
import {databaseNames, possibleDBKeys} from './types'; import {databaseConf, possibleDBKeys} from './types';
export const getEntry = async (dbName: databaseNames, key: possibleDBKeys) => { export const getEntry = async <T2 extends databaseConf<T>, T>(
schema: T2,
key: possibleDBKeys,
): Promise<null | T> => {
const dbName = schema.details.name;
const db = await getDatabase(dbName); const db = await getDatabase(dbName);
const UserId = MyUserManager.getSelectedUserId();
const tx = db.transaction(dbName, 'readonly'); const tx = db.transaction(dbName, 'readonly');
const store = tx.objectStore(dbName); const store = tx.objectStore(dbName);

View File

@ -67,7 +67,7 @@ export async function openMyDatabase(
} }
return await Realm.open({ return await Realm.open({
schema: [schema.details], schema: [schema.details as any],
schemaVersion: schema.version, schemaVersion: schema.version,
path, path,
encryptionKey: getKey(), encryptionKey: getKey(),

View File

@ -1,5 +1,6 @@
import {getEntry} from '../get'; import {getEntry} from '../get';
import {DBMigration} from '../migration'; import {DBMigration} from '../migration';
import {setEntry} from '../set';
import {databaseConf, possibleDBKeys} from '../types'; import {databaseConf, possibleDBKeys} from '../types';
@ -22,9 +23,17 @@ const thisSchema: databaseConf<typeof propsDefault> = {
migration: () => { migration: () => {
return DBMigration[name](thisSchema); return DBMigration[name](thisSchema);
}, },
setEntry: (val: typeof thisSchema.defaultProps) => {
return setEntry<typeof thisSchema, typeof thisSchema.defaultProps>(
thisSchema,
val,
);
},
getEntry: (key: possibleDBKeys) => { getEntry: (key: possibleDBKeys) => {
const thisObj = thisSchema; return getEntry<typeof thisSchema, typeof thisSchema.defaultProps>(
return getEntry<typeof thisObj, typeof thisObj.defaultProps>(thisObj, key); thisSchema,
key,
);
}, },
defaultProps: propsDefault, defaultProps: propsDefault,
details: { details: {

View File

@ -1,5 +1,6 @@
import {getEntry} from '../get'; import {getEntry} from '../get';
import {DBMigration} from '../migration'; import {DBMigration} from '../migration';
import {setEntry} from '../set';
import {databaseConf, possibleDBKeys} from '../types'; import {databaseConf, possibleDBKeys} from '../types';
@ -15,7 +16,9 @@ const propsType: {[key in keyof typeof propsDefault]: string} = {
FollowingCount: 'int', FollowingCount: 'int',
lastUpdateTimestamp: 'int', lastUpdateTimestamp: 'int',
ProfilePicture: 'string', //URL ProfilePicture: 'string', //URL
ProfilePictureBinary: 'data', ProfilePictureBinaryLQ: 'data',
ProfilePictureBinaryHQ: 'data',
XpLevel: 'int', XpLevel: 'int',
XpPoints: 'int', XpPoints: 'int',
}; };
@ -29,7 +32,8 @@ const propsDefault = {
FollowingCount: 0, FollowingCount: 0,
lastUpdateTimestamp: 0, lastUpdateTimestamp: 0,
ProfilePicture: '', //URL ProfilePicture: '', //URL
ProfilePictureBinary: [], ProfilePictureBinaryLQ: new ArrayBuffer(0),
ProfilePictureBinaryHQ: new ArrayBuffer(0),
XpLevel: 0, XpLevel: 0,
XpPoints: 0, XpPoints: 0,
}; };
@ -40,9 +44,17 @@ const thisSchema: databaseConf<typeof propsDefault> = {
migration: () => { migration: () => {
return DBMigration[name](thisSchema); return DBMigration[name](thisSchema);
}, },
setEntry: (val: typeof thisSchema.defaultProps) => {
return setEntry<typeof thisSchema, typeof thisSchema.defaultProps>(
thisSchema,
val,
);
},
getEntry: (key: possibleDBKeys) => { getEntry: (key: possibleDBKeys) => {
const thisObj = thisSchema; return getEntry<typeof thisSchema, typeof thisSchema.defaultProps>(
return getEntry<typeof thisObj, typeof thisObj.defaultProps>(thisObj, key); thisSchema,
key,
);
}, },
defaultProps: propsDefault, defaultProps: propsDefault,
details: { details: {

View File

@ -1,10 +1,14 @@
import {getDatabase} from './getDB'; import {getDatabase} from './getDB';
import {databaseNames} from './types'; import {databaseConf} from './types';
export const setEntry = async (dbName: databaseNames, value: any) => { export const setEntry = async <T2 extends databaseConf<T>, T>(
schema: T2,
value: T,
) => {
const dbName = schema.details.name;
const realm = await getDatabase(dbName); const realm = await getDatabase(dbName);
realm.write(() => { realm.write(() => {
realm.create(dbName, value, Realm.UpdateMode.Modified); realm.create(dbName, value as any, Realm.UpdateMode.Modified);
}); });
}; };

View File

@ -1,15 +1,16 @@
import MyUserManager from '@caj/user/MyUserManager';
import {getDatabase} from './getDB.web'; import {getDatabase} from './getDB.web';
import {databaseNames} from './types'; import {databaseConf} from './types';
export const setEntry = async (dbName: databaseNames, value: any) => { export const setEntry = async <T2 extends databaseConf<T>, T>(
schema: T2,
value: T,
) => {
const dbName = schema.details.name;
const db = await getDatabase(dbName); const db = await getDatabase(dbName);
const UserId = MyUserManager.getSelectedUserId();
const tx = db.transaction(dbName, 'readwrite'); const tx = db.transaction(dbName, 'readwrite');
const store = tx.objectStore(dbName); const store = tx.objectStore(dbName);
//const val = (await store.get('counter')) || 0;
await store.put(value); await store.put(value);
await tx.done; await tx.done;
}; };

View File

@ -6,6 +6,7 @@ export interface databaseConf<props> {
version: number; version: number;
migration?: any; migration?: any;
getEntry: (key: possibleDBKeys) => Promise<props | null>; getEntry: (key: possibleDBKeys) => Promise<props | null>;
setEntry: (val: props) => Promise<void>;
defaultProps: props; defaultProps: props;
details: { details: {
name: databaseNames; name: databaseNames;

View File

@ -36,7 +36,6 @@ function createNewMyUser(
WebSocketSessionId, WebSocketSessionId,
lastUpdateTimestamp: Math.floor(new Date().getTime() / 1000), lastUpdateTimestamp: Math.floor(new Date().getTime() / 1000),
ProfilePicture: { ProfilePicture: {
hq: createUserProp(SourceProp.online),
lq: createUserProp(SourceProp.online), lq: createUserProp(SourceProp.online),
}, },
userSettings: { userSettings: {

View File

@ -1,16 +1,26 @@
import {maxCachedUsers} from '@caj/configs/appNonSaveVar';
import {appNonSaveVarActions} from '@caj/configs/appNonSaveVarReducer';
import {UserId, XAuthorization} from '@caj/configs/types'; import {UserId, XAuthorization} from '@caj/configs/types';
import {makeRequest, apiBackendRequest} from '@caj/helper/request'; import {makeRequest, apiBackendRequest} from '@caj/helper/request';
import BigDataManager from '@caj/helper/storage/BigDataManager'; import BigDataManager from '@caj/helper/storage/BigDataManager';
import {store} from '@caj/redux/store'; import {RootState, store} from '@caj/redux/store';
import {useSelector} from 'react-redux';
import {createUserProp, SourceProp, User} from './types'; import {createUserProp, SourceProp, User} from './types';
let cachedUserList: UserId[] = [];
async function getUser( async function getUser(
UserId: UserId, UserId: UserId,
save?: boolean, save?: boolean,
): Promise<User | undefined> { ): Promise<User | undefined> {
if (UserId === 'none') {
return undefined;
}
let user: User | undefined; let user: User | undefined;
let state = store.getState(); let state = store.getState();
let userIsInCache = false;
if (UserId === state.appVariables.preferences.selectedAccount) { if (UserId === state.appVariables.preferences.selectedAccount) {
const usr = state.appVariables.preferences.accounts[UserId]; const usr = state.appVariables.preferences.accounts[UserId];
@ -31,18 +41,42 @@ async function getUser(
} }
} }
if (user === undefined) {
const usr = state.nonSaveVariables.cachedUsers[UserId];
if (usr !== undefined) {
user = usr;
userIsInCache = true;
}
}
if (user === undefined) { if (user === undefined) {
const usr = await BigDataManager.databases.users.getEntry(UserId); const usr = await BigDataManager.databases.users.getEntry(UserId);
if (usr !== null) { if (usr !== undefined && usr !== null) {
let ProfilePicture = {
lq:
usr.ProfilePictureBinaryLQ.byteLength !== 0
? createUserProp(
SourceProp.offline,
new Blob([usr.ProfilePictureBinaryLQ]),
)
: createUserProp(SourceProp.online, usr.ProfilePicture),
hq:
usr.ProfilePictureBinaryHQ.byteLength !== 0
? createUserProp(
SourceProp.offline,
new Blob([usr.ProfilePictureBinaryHQ]),
)
: createUserProp(SourceProp.online, usr.ProfilePicture),
};
user = { user = {
AccountName: createUserProp(SourceProp.offline, usr.AccountName), AccountName: createUserProp(SourceProp.offline, usr.AccountName),
Description: createUserProp(SourceProp.offline, usr.Description), Description: createUserProp(SourceProp.offline, usr.Description),
FollowersCount: createUserProp(SourceProp.offline, usr.FollowersCount), FollowersCount: createUserProp(SourceProp.offline, usr.FollowersCount),
FollowingCount: createUserProp(SourceProp.offline, usr.FollowingCount), FollowingCount: createUserProp(SourceProp.offline, usr.FollowingCount),
lastUpdateTimestamp: usr.lastUpdateTimestamp, lastUpdateTimestamp: usr.lastUpdateTimestamp,
ProfilePicture: createUserProp(SourceProp.offline, usr.ProfilePicture), ProfilePicture,
UserId, UserId,
Username: createUserProp(SourceProp.offline, usr.Username), Username: createUserProp(SourceProp.offline, usr.Username),
XpLevel: createUserProp(SourceProp.offline, usr.XpLevel), XpLevel: createUserProp(SourceProp.offline, usr.XpLevel),
@ -87,7 +121,6 @@ async function getUser(
), ),
lastUpdateTimestamp: Math.floor(new Date().getTime() / 1000), lastUpdateTimestamp: Math.floor(new Date().getTime() / 1000),
ProfilePicture: { ProfilePicture: {
hq: createUserProp(SourceProp.online, resp.response.AvatarUrl),
lq: createUserProp(SourceProp.online, resp.response.AvatarUrl), lq: createUserProp(SourceProp.online, resp.response.AvatarUrl),
}, },
UserId, UserId,
@ -96,14 +129,37 @@ async function getUser(
XpPoints: createUserProp(SourceProp.cached, resp.response.XpPoints), XpPoints: createUserProp(SourceProp.cached, resp.response.XpPoints),
}; };
BigDataManager.setEntry('users', user); //BigDataManager.setEntry('users', user);
} catch (error: any) { } catch (error: any) {
console.error(error.status); console.error(error.status);
} }
} }
if (userIsInCache === false && user !== undefined) {
store.dispatch(appNonSaveVarActions.setCachedUser(user));
cachedUserList.push(user.UserId);
if (cachedUserList.length > maxCachedUsers) {
let usrId = cachedUserList[0];
cachedUserList.shift();
console.log('usrId', usrId);
store.dispatch(appNonSaveVarActions.removeCachedUser(usrId));
}
}
return user; return user;
} }
const UserManager = {getUser}; function getUserSelector(UserId: UserId) {
getUser(UserId);
const myUser = useSelector(
(state: RootState) => state.nonSaveVariables.cachedUsers[UserId],
);
return myUser;
}
const UserManager = {getUser, getUserSelector};
export default UserManager; export default UserManager;

View File

@ -23,8 +23,8 @@ interface BasicUserProp<T1> {
} }
export interface ProfilePicture { export interface ProfilePicture {
lq: BasicUserProp<string>; lq: BasicUserProp<string | Blob>;
hq: BasicUserProp<string>; hq?: BasicUserProp<string | Blob>;
} }
export interface User { export interface User {