@norcy/react-native-toolkit 0.1.113 → 0.1.115
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/.DS_Store +0 -0
- package/lib/commonjs/ConfigDataModel.js +7 -47
- package/lib/commonjs/ConfigDataModel.js.map +1 -1
- package/lib/commonjs/MessageModel.js +14 -6
- package/lib/commonjs/MessageModel.js.map +1 -1
- package/lib/commonjs/VersionManager.js +77 -0
- package/lib/commonjs/VersionManager.js.map +1 -0
- package/lib/module/ConfigDataModel.js +6 -47
- package/lib/module/ConfigDataModel.js.map +1 -1
- package/lib/module/MessageModel.js +13 -6
- package/lib/module/MessageModel.js.map +1 -1
- package/lib/module/VersionManager.js +71 -0
- package/lib/module/VersionManager.js.map +1 -0
- package/lib/typescript/ConfigDataModel.d.ts +0 -6
- package/lib/typescript/VersionManager.d.ts +13 -0
- package/package.json +1 -1
- package/src/ConfigDataModel.ts +10 -49
- package/src/MessageModel.ts +22 -5
- package/src/VersionManager.ts +88 -0
package/.DS_Store
CHANGED
Binary file
|
@@ -5,37 +5,19 @@ Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
});
|
6
6
|
exports.ConfigDataModel = void 0;
|
7
7
|
var _reactNative = require("react-native");
|
8
|
-
var _reactNativeDeviceInfo = require("react-native-device-info");
|
9
|
-
var _DevConfig = require("./DevConfig");
|
10
8
|
var _LoginManager = require("./LoginManager");
|
11
9
|
var _Notification = require("./Notification");
|
12
|
-
var
|
10
|
+
var _VersionManager = _interopRequireDefault(require("./VersionManager"));
|
13
11
|
var _VipAndroidManager = require("./VipAndroidManager");
|
12
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
14
13
|
const EventEmitter = require('events').EventEmitter;
|
15
14
|
const eventEmitter = new EventEmitter();
|
16
|
-
const semverGt = require('semver/functions/gt');
|
17
|
-
const semverGte = require('semver/functions/gte');
|
18
|
-
const semverCoerce = require('semver/functions/coerce');
|
19
15
|
let MyItems = {};
|
20
|
-
let VersionInfo = {
|
21
|
-
currentVersion: semverCoerce((0, _reactNativeDeviceInfo.getReadableVersion)()).version,
|
22
|
-
latestVersion: semverCoerce((0, _reactNativeDeviceInfo.getReadableVersion)()).version,
|
23
|
-
isDanger: false,
|
24
|
-
hasNewVersion: false
|
25
|
-
};
|
26
16
|
const AV = require('leancloud-storage');
|
27
17
|
const _filterByVersion = items => {
|
28
18
|
let ret = [];
|
29
|
-
const curVer = semverCoerce((0, _reactNativeDeviceInfo.getReadableVersion)()).version;
|
30
19
|
for (const item of items) {
|
31
|
-
|
32
|
-
const minVer = (_item$get = item.get('minVer')) === null || _item$get === void 0 ? void 0 : _item$get.trim();
|
33
|
-
const maxVer = (_item$get2 = item.get('maxVer')) === null || _item$get2 === void 0 ? void 0 : _item$get2.trim();
|
34
|
-
// 确保 cur 处于 [minVer, maxVer)
|
35
|
-
if (!!minVer && semverGt(semverCoerce(minVer).version, curVer)) {
|
36
|
-
continue;
|
37
|
-
}
|
38
|
-
if (!!maxVer && semverGte(curVer, semverCoerce(maxVer).version)) {
|
20
|
+
if (!_VersionManager.default.isValidVersion(item.get('minVer'), item.get('maxVer'))) {
|
39
21
|
continue;
|
40
22
|
}
|
41
23
|
ret.push(item);
|
@@ -53,29 +35,10 @@ const _updateKeyValues = items => {
|
|
53
35
|
}
|
54
36
|
};
|
55
37
|
const handleVersionInfo = () => {
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
}
|
61
|
-
const configVersion = ConfigDataModel.get(key);
|
62
|
-
if (configVersion) {
|
63
|
-
const onlineVersion = semverCoerce(configVersion).version;
|
64
|
-
// current < online,才有新版本
|
65
|
-
if (semverGt(onlineVersion, VersionInfo.currentVersion)) {
|
66
|
-
VersionInfo.latestVersion = onlineVersion;
|
67
|
-
VersionInfo.hasNewVersion = true;
|
68
|
-
}
|
69
|
-
// current <= online,才安全 ,防止忘记修改 online
|
70
|
-
if (semverGt(VersionInfo.currentVersion, onlineVersion)) {
|
71
|
-
VersionInfo.isDanger = true;
|
72
|
-
}
|
73
|
-
}
|
74
|
-
if (__DEV__) {
|
75
|
-
if (_DevConfig.DevConfig.hasValue(_PrefData.BuildInPrefs.DevDanger)) {
|
76
|
-
VersionInfo.isDanger = _DevConfig.DevConfig.getValue(_PrefData.BuildInPrefs.DevDanger);
|
77
|
-
}
|
78
|
-
}
|
38
|
+
_VersionManager.default.init({
|
39
|
+
latestAppVersion: ConfigDataModel.get(_reactNative.Platform.OS === 'android' ? 'aov' : 'ov'),
|
40
|
+
latestBundleVersion: ConfigDataModel.get('bov')
|
41
|
+
});
|
79
42
|
};
|
80
43
|
let isDataReady = false;
|
81
44
|
let isNetwordDataReady = false;
|
@@ -128,9 +91,6 @@ const ConfigDataModel = exports.ConfigDataModel = {
|
|
128
91
|
console.error(e);
|
129
92
|
});
|
130
93
|
},
|
131
|
-
getVersionConfig: () => {
|
132
|
-
return VersionInfo;
|
133
|
-
},
|
134
94
|
get: key => {
|
135
95
|
return MyItems[key];
|
136
96
|
},
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":["_reactNative","require","_reactNativeDeviceInfo","_DevConfig","_LoginManager","_Notification","_PrefData","_VipAndroidManager","EventEmitter","eventEmitter","semverGt","semverGte","semverCoerce","MyItems","VersionInfo","currentVersion","getReadableVersion","version","latestVersion","isDanger","hasNewVersion","AV","_filterByVersion","items","ret","curVer","item","_item$get","_item$get2","minVer","get","trim","maxVer","push","_updateKeyValues","value","handleVersionInfo","key","Platform","OS","configVersion","ConfigDataModel","onlineVersion","__DEV__","DevConfig","hasValue","BuildInPrefs","DevDanger","getValue","isDataReady","isNetwordDataReady","_handleResponse","OnlineItems","console","log","VipAndroidManager","setOfferings","emitChange","exports","init","defaultValues","Notification","addListener","_ref","isAuto","user","error","fetch","query","Query","equalTo","find","then","catch","e","getVersionConfig","emit","addListenerOnce","callback","once","on","shouldEnableByRate","enable","rate","_LoginManager$current","_LoginManager$current2","r","lastChar","LoginManager","currentUser","AVUser","slice","indexOf","toLowerCase"],"sources":["ConfigDataModel.ts"],"sourcesContent":["import { Object } from 'leancloud-storage';\nimport { Platform } from 'react-native';\nimport { getReadableVersion } from 'react-native-device-info';\nimport { DevConfig } from './DevConfig';\nimport { LoginManager, LoginResultDataType } from './LoginManager';\nimport { Notification } from './Notification';\nimport { BuildInPrefs } from './PrefData';\nimport { VipAndroidManager } from './VipAndroidManager';\n\nconst EventEmitter = require('events').EventEmitter;\nconst eventEmitter = new EventEmitter();\nconst semverGt = require('semver/functions/gt');\nconst semverGte = require('semver/functions/gte');\nconst semverCoerce = require('semver/functions/coerce');\n\nexport interface ConfigsType {\n [key: string]: any;\n}\nlet MyItems: ConfigsType = {};\nlet VersionInfo = {\n currentVersion: semverCoerce(getReadableVersion()).version,\n latestVersion: semverCoerce(getReadableVersion()).version,\n isDanger: false,\n hasNewVersion: false,\n};\n\nconst AV = require('leancloud-storage');\n\nconst _filterByVersion = (items: Object[]) => {\n let ret = [];\n const curVer = semverCoerce(getReadableVersion()).version;\n for (const item of items) {\n const minVer = item.get('minVer')?.trim();\n const maxVer = item.get('maxVer')?.trim();\n // 确保 cur 处于 [minVer, maxVer)\n if (!!minVer && semverGt(semverCoerce(minVer).version, curVer)) {\n continue;\n }\n if (!!maxVer && semverGte(curVer, semverCoerce(maxVer).version)) {\n continue;\n }\n\n ret.push(item);\n }\n return ret;\n};\n\nconst _updateKeyValues = (items: Object[]) => {\n for (const item of items) {\n let value = item.get('value');\n if (typeof value === 'string') {\n // 因为 leancloud 无法配置空白内容,所以 trim 下,这样就能以空格代替空白{\n value = value.trim();\n }\n MyItems[item.get('key')] = value;\n }\n};\n\nconst handleVersionInfo = () => {\n // online > current,则更新 latestVersion\n let key = 'ov';\n if (Platform.OS === 'android') {\n key = 'aov';\n }\n const configVersion = ConfigDataModel.get(key);\n if (configVersion) {\n const onlineVersion = semverCoerce(configVersion).version;\n // current < online,才有新版本\n if (semverGt(onlineVersion, VersionInfo.currentVersion)) {\n VersionInfo.latestVersion = onlineVersion;\n VersionInfo.hasNewVersion = true;\n }\n // current <= online,才安全 ,防止忘记修改 online\n if (semverGt(VersionInfo.currentVersion, onlineVersion)) {\n VersionInfo.isDanger = true;\n }\n }\n\n if (__DEV__) {\n if (DevConfig.hasValue(BuildInPrefs.DevDanger)) {\n VersionInfo.isDanger = DevConfig.getValue(BuildInPrefs.DevDanger);\n }\n }\n};\n\nlet isDataReady = false;\nlet isNetwordDataReady = false;\n\nconst _handleResponse = (OnlineItems: Object[]) => {\n if (!isNetwordDataReady) {\n return;\n }\n\n // 根据版本过滤\n let items = _filterByVersion(OnlineItems);\n _updateKeyValues(items);\n // 处理 Version 信息\n handleVersionInfo();\n console.log('Config 处理完毕');\n isDataReady = true;\n VipAndroidManager.setOfferings(ConfigDataModel.get('vip_android_offerings'));\n ConfigDataModel.emitChange();\n};\n\n// ConfigDataModel 的 Config 是支持后台配置多条同一个 Key 的,按版本区分\nconst ConfigDataModel = {\n init: (defaultValues: ConfigsType) => {\n MyItems = defaultValues;\n\n Notification.addListener(\n 'onLogin',\n ({ isAuto, user, error }: LoginResultDataType) => {\n if (!isAuto && user && !error) {\n isDataReady = false;\n isNetwordDataReady = false;\n ConfigDataModel.fetch();\n }\n }\n );\n\n ConfigDataModel.fetch();\n },\n\n fetch: () => {\n // 确保可重入,但如果网络一直出错的话,每次调用都会一直发\n if (isNetwordDataReady) {\n return;\n }\n\n const query = new AV.Query('Configs');\n query.equalTo('valid', true).equalTo(Platform.OS, true);\n query\n .find()\n .then((items: Object[]) => {\n console.log('Config 抓取完毕');\n isNetwordDataReady = true;\n _handleResponse(items);\n })\n .catch((e: any) => {\n console.error(e);\n });\n },\n\n getVersionConfig: () => {\n return VersionInfo;\n },\n\n get: (key: string) => {\n return MyItems[key];\n },\n\n emitChange: () => {\n eventEmitter.emit('change');\n },\n\n addListenerOnce: (callback: Function) => {\n if (isDataReady) {\n callback && callback();\n return;\n }\n eventEmitter.once('change', callback);\n },\n\n addListener: (callback: Function) => {\n if (isDataReady) {\n callback && callback();\n return;\n }\n eventEmitter.on('change', callback);\n },\n\n shouldEnableByRate: (enable?: boolean, rate?: number) => {\n if (!enable) {\n return false;\n }\n // rate 不传,默认为全量\n const r = rate ?? 1;\n if (r <= 0) {\n return false;\n }\n // ID 最后一位是 16 进制(0-f),未登录默认为全量\n const lastChar =\n LoginManager.currentUser()?.AVUser?.get('objectId')?.slice(-1) ?? '0';\n return '0123456789abcdef'.indexOf(lastChar.toLowerCase()) < r * 16;\n },\n};\n\nexport { ConfigDataModel };\n"],"mappings":"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"}
|
1
|
+
{"version":3,"names":["_reactNative","require","_LoginManager","_Notification","_VersionManager","_interopRequireDefault","_VipAndroidManager","obj","__esModule","default","EventEmitter","eventEmitter","MyItems","AV","_filterByVersion","items","ret","item","VersionManager","isValidVersion","get","push","_updateKeyValues","value","trim","handleVersionInfo","init","latestAppVersion","ConfigDataModel","Platform","OS","latestBundleVersion","isDataReady","isNetwordDataReady","_handleResponse","OnlineItems","console","log","VipAndroidManager","setOfferings","emitChange","exports","defaultValues","Notification","addListener","_ref","isAuto","user","error","fetch","query","Query","equalTo","find","then","catch","e","key","emit","addListenerOnce","callback","once","on","shouldEnableByRate","enable","rate","_LoginManager$current","_LoginManager$current2","r","lastChar","LoginManager","currentUser","AVUser","slice","indexOf","toLowerCase"],"sources":["ConfigDataModel.ts"],"sourcesContent":["import { Object } from 'leancloud-storage';\nimport { Platform } from 'react-native';\nimport { LoginManager, LoginResultDataType } from './LoginManager';\nimport { Notification } from './Notification';\nimport VersionManager from './VersionManager';\nimport { VipAndroidManager } from './VipAndroidManager';\n\nconst EventEmitter = require('events').EventEmitter;\nconst eventEmitter = new EventEmitter();\n\nexport interface ConfigsType {\n [key: string]: any;\n}\nlet MyItems: ConfigsType = {};\n\nconst AV = require('leancloud-storage');\n\nconst _filterByVersion = (items: Object[]) => {\n let ret = [];\n for (const item of items) {\n if (\n !VersionManager.isValidVersion(item.get('minVer'), item.get('maxVer'))\n ) {\n continue;\n }\n ret.push(item);\n }\n return ret;\n};\n\nconst _updateKeyValues = (items: Object[]) => {\n for (const item of items) {\n let value = item.get('value');\n if (typeof value === 'string') {\n // 因为 leancloud 无法配置空白内容,所以 trim 下,这样就能以空格代替空白{\n value = value.trim();\n }\n MyItems[item.get('key')] = value;\n }\n};\n\nconst handleVersionInfo = () => {\n VersionManager.init({\n latestAppVersion: ConfigDataModel.get(\n Platform.OS === 'android' ? 'aov' : 'ov'\n ),\n latestBundleVersion: ConfigDataModel.get('bov'),\n });\n};\n\nlet isDataReady = false;\nlet isNetwordDataReady = false;\n\nconst _handleResponse = (OnlineItems: Object[]) => {\n if (!isNetwordDataReady) {\n return;\n }\n\n // 根据版本过滤\n let items = _filterByVersion(OnlineItems);\n _updateKeyValues(items);\n // 处理 Version 信息\n handleVersionInfo();\n console.log('Config 处理完毕');\n isDataReady = true;\n VipAndroidManager.setOfferings(ConfigDataModel.get('vip_android_offerings'));\n ConfigDataModel.emitChange();\n};\n\n// ConfigDataModel 的 Config 是支持后台配置多条同一个 Key 的,按版本区分\nconst ConfigDataModel = {\n init: (defaultValues: ConfigsType) => {\n MyItems = defaultValues;\n\n Notification.addListener(\n 'onLogin',\n ({ isAuto, user, error }: LoginResultDataType) => {\n if (!isAuto && user && !error) {\n isDataReady = false;\n isNetwordDataReady = false;\n ConfigDataModel.fetch();\n }\n }\n );\n\n ConfigDataModel.fetch();\n },\n\n fetch: () => {\n // 确保可重入,但如果网络一直出错的话,每次调用都会一直发\n if (isNetwordDataReady) {\n return;\n }\n\n const query = new AV.Query('Configs');\n query.equalTo('valid', true).equalTo(Platform.OS, true);\n query\n .find()\n .then((items: Object[]) => {\n console.log('Config 抓取完毕');\n isNetwordDataReady = true;\n _handleResponse(items);\n })\n .catch((e: any) => {\n console.error(e);\n });\n },\n\n get: (key: string) => {\n return MyItems[key];\n },\n\n emitChange: () => {\n eventEmitter.emit('change');\n },\n\n addListenerOnce: (callback: Function) => {\n if (isDataReady) {\n callback && callback();\n return;\n }\n eventEmitter.once('change', callback);\n },\n\n addListener: (callback: Function) => {\n if (isDataReady) {\n callback && callback();\n return;\n }\n eventEmitter.on('change', callback);\n },\n\n shouldEnableByRate: (enable?: boolean, rate?: number) => {\n if (!enable) {\n return false;\n }\n // rate 不传,默认为全量\n const r = rate ?? 1;\n if (r <= 0) {\n return false;\n }\n // ID 最后一位是 16 进制(0-f),未登录默认为全量\n const lastChar =\n LoginManager.currentUser()?.AVUser?.get('objectId')?.slice(-1) ?? '0';\n return '0123456789abcdef'.indexOf(lastChar.toLowerCase()) < r * 16;\n },\n};\n\nexport { ConfigDataModel };\n"],"mappings":"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"}
|
@@ -12,7 +12,9 @@ var _LoginManager = require("./LoginManager");
|
|
12
12
|
var _Notification = require("./Notification");
|
13
13
|
var _PrefData = require("./PrefData");
|
14
14
|
var _Tool = require("./Tool");
|
15
|
+
var _VersionManager = _interopRequireDefault(require("./VersionManager"));
|
15
16
|
var _VipManager = require("./VipManager");
|
17
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
16
18
|
const AV = require('leancloud-storage');
|
17
19
|
const EventEmitter = require('events').EventEmitter;
|
18
20
|
const eventEmitter = new EventEmitter();
|
@@ -89,8 +91,7 @@ const _handleReadMessages = items => {
|
|
89
91
|
if (item.key === 'changeLog') {
|
90
92
|
// 强制升级弹窗
|
91
93
|
// Message 是在 Config 回包之后再请求的,因此此时 Config 的值一定是准确的
|
92
|
-
|
93
|
-
if (_ConfigDataModel.ConfigDataModel.get('upgrade_alert') && config.hasNewVersion) {
|
94
|
+
if (_ConfigDataModel.ConfigDataModel.get('upgrade_alert') && _VersionManager.default.hasNewAppVer()) {
|
94
95
|
item.isRead = false;
|
95
96
|
item.updatedAt = new Date().toString();
|
96
97
|
}
|
@@ -116,14 +117,14 @@ const _handleReadMessages = items => {
|
|
116
117
|
};
|
117
118
|
let isDataReady = false;
|
118
119
|
let isConfigStateReady = false;
|
120
|
+
let isVipStateReady = false;
|
119
121
|
let isNetwordDataReady = false;
|
120
122
|
let OnlineItems = [];
|
121
123
|
const _handleResponse = customFilter => {
|
122
|
-
|
123
|
-
if (!isConfigStateReady || !OnlineItems.length || !isNetwordDataReady) {
|
124
|
+
if (!isConfigStateReady || !OnlineItems.length || !isNetwordDataReady || !isVipStateReady) {
|
124
125
|
return;
|
125
126
|
}
|
126
|
-
if (
|
127
|
+
if (_VersionManager.default.isDanger()) {
|
127
128
|
return;
|
128
129
|
}
|
129
130
|
MyMessages = OnlineItems.map(item => _Tool.Tool.jsonify(item));
|
@@ -147,7 +148,13 @@ const _handleResponse = customFilter => {
|
|
147
148
|
};
|
148
149
|
const MessageModel = exports.MessageModel = {
|
149
150
|
init: customFilter => {
|
150
|
-
|
151
|
+
_Notification.Notification.addListener('onVipRefresh', () => {
|
152
|
+
// 监听多次,直到成功,整个生命周期最多处理一次
|
153
|
+
if (!isVipStateReady) {
|
154
|
+
isVipStateReady = true;
|
155
|
+
_handleResponse(customFilter);
|
156
|
+
}
|
157
|
+
});
|
151
158
|
_ConfigDataModel.ConfigDataModel.addListener(() => {
|
152
159
|
if (!isConfigStateReady) {
|
153
160
|
isConfigStateReady = true;
|
@@ -163,6 +170,7 @@ const MessageModel = exports.MessageModel = {
|
|
163
170
|
if (!isAuto && user && !error) {
|
164
171
|
isDataReady = false;
|
165
172
|
isConfigStateReady = false;
|
173
|
+
isVipStateReady = false;
|
166
174
|
isNetwordDataReady = false;
|
167
175
|
OnlineItems = [];
|
168
176
|
MessageModel.fetch(customFilter);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":["_reactNative","require","_reactNativeDeviceInfo","_ConfigDataModel","_Frequence","_LoginManager","_Notification","_PrefData","_Tool","_VipManager","AV","EventEmitter","eventEmitter","semverGt","semverGte","semverCoerce","MyMessages","_filterByVersion","items","ret","curVer","getReadableVersion","version","item","_item$minVer","_item$maxVer","minVer","trim","maxVer","push","_filterByVip","isVip","VipManager","isForeverVip","vipFilter","_filterByUser","users","length","LoginManager","isLogin","_LoginManager$current","includes","currentUser","AVUser","get","_handleReadMessages","__DEV__","readMsgs","PrefData","getValue","BuildInPrefs","Messages","objectId","isRead","_item$key","key","config","ConfigDataModel","getVersionConfig","hasNewVersion","updatedAt","Date","toString","freConfig","limit","gap","FrequenceManager","canRun","configValue","_getConfigValue","lastTimestamp","isDataReady","isConfigStateReady","isNetwordDataReady","OnlineItems","_handleResponse","customFilter","_ConfigDataModel$getV","isDanger","map","Tool","jsonify","sort","a","b","dateA","getTime","dateB","console","log","MessageModel","emitChange","exports","init","addListener","Notification","_ref","isAuto","user","error","fetch","query","Query","equalTo","Platform","OS","descending","find","then","catch","e","getUnreadMessages","filter","getAllMessages","markMessageRead","message","markFinishForTime","markFinishForCount","setValue","emit","slice","addListenerOnce","callback","once","on","removeListener"],"sources":["MessageModel.ts"],"sourcesContent":["import { Object } from 'leancloud-storage';\nimport { Platform } from 'react-native';\nimport { getReadableVersion } from 'react-native-device-info';\nimport { ConfigDataModel } from './ConfigDataModel';\nimport { FreConfigType, FrequenceManager } from './Frequence';\nimport { LoginManager, LoginResultDataType } from './LoginManager';\nimport { Notification } from './Notification';\nimport { BuildInPrefs, PrefData } from './PrefData';\nimport { Tool } from './Tool';\nimport { VipManager } from './VipManager';\n\nconst AV = require('leancloud-storage');\nconst EventEmitter = require('events').EventEmitter;\nconst eventEmitter = new EventEmitter();\nconst semverGt = require('semver/functions/gt');\nconst semverGte = require('semver/functions/gte');\nconst semverCoerce = require('semver/functions/coerce');\n\nexport interface Message {\n objectId: string;\n android: boolean;\n ios: boolean;\n title?: string;\n content?: string;\n maxVer?: string;\n minVer?: string;\n key?: string;\n updatedAt: string;\n valid: boolean;\n vipFilter?: number;\n isRead: boolean;\n users?: string[];\n limit?: number;\n gap?: number;\n url: string;\n actionTitle?: string;\n}\n\nlet MyMessages: Message[] = [];\n\nconst _filterByVersion = (items: Message[]): Message[] => {\n let ret: Message[] = [];\n const curVer = semverCoerce(getReadableVersion()).version;\n for (const item of items) {\n const minVer = item.minVer?.trim();\n const maxVer = item.maxVer?.trim();\n // 确保 cur 处于 [minVer, maxVer)\n if (!!minVer && semverGt(semverCoerce(minVer).version, curVer)) {\n continue;\n }\n if (!!maxVer && semverGte(curVer, semverCoerce(maxVer).version)) {\n continue;\n }\n\n ret.push(item);\n }\n return ret;\n};\n\nconst _filterByVip = (items: Message[]): Message[] => {\n let ret: Message[] = [];\n const isVip = VipManager.isVip();\n const isForeverVip = VipManager.isForeverVip();\n for (const item of items) {\n const vipFilter = item.vipFilter;\n if (\n vipFilter === 0 ||\n (vipFilter === 1 && !isVip) ||\n (vipFilter === 2 && !isForeverVip)\n ) {\n ret.push(item);\n }\n }\n return ret;\n};\n\nconst _filterByUser = (items: Message[]): Message[] => {\n let ret: Message[] = [];\n for (const item of items) {\n const users = item.users;\n if (users?.length) {\n if (LoginManager.isLogin()) {\n if (\n users?.includes(LoginManager.currentUser()?.AVUser.get('objectId'))\n ) {\n ret.push(item);\n }\n }\n } else {\n ret.push(item);\n }\n }\n return ret;\n};\n\nconst _handleReadMessages = (items: Message[]): Message[] => {\n if (__DEV__) {\n // return items;\n }\n\n // 根据已读状态标为已读\n const readMsgs = PrefData.getValue(BuildInPrefs.Messages);\n for (const item of items) {\n if (readMsgs.includes(item.objectId)) {\n item.isRead = true;\n }\n }\n\n // 挑选需要强制未读\n for (const item of items) {\n if (!item.isRead) {\n continue;\n }\n if (item.key === 'changeLog') {\n // 强制升级弹窗\n // Message 是在 Config 回包之后再请求的,因此此时 Config 的值一定是准确的\n const config = ConfigDataModel.getVersionConfig();\n if (ConfigDataModel.get('upgrade_alert') && config.hasNewVersion) {\n item.isRead = false;\n item.updatedAt = new Date().toString();\n }\n } else if (item.key?.length) {\n // 如果是带 Key 的,那么会根据 limit 或 gap 再给一次标为未读的机会\n const freConfig: FreConfigType = {\n key: item.key,\n limit: item.limit,\n gap: item.gap,\n };\n if (FrequenceManager.canRun(freConfig)) {\n item.isRead = false;\n item.updatedAt = new Date().toString();\n } else {\n const configValue = FrequenceManager._getConfigValue(freConfig);\n if (configValue.lastTimestamp) {\n item.updatedAt = new Date(\n configValue.lastTimestamp * 1000\n ).toString();\n }\n }\n }\n }\n\n return items;\n};\n\nlet isDataReady = false;\nlet isConfigStateReady = false;\nlet isNetwordDataReady = false;\nlet OnlineItems: Object[] = [];\n\nconst _handleResponse = (customFilter?: MessageFilter) => {\n if (!isConfigStateReady || !OnlineItems.length || !isNetwordDataReady) {\n return;\n }\n\n if (ConfigDataModel.getVersionConfig()?.isDanger) {\n return;\n }\n\n MyMessages = OnlineItems.map((item) => Tool.jsonify(item));\n MyMessages = _filterByVersion(MyMessages);\n MyMessages = _filterByVip(MyMessages);\n MyMessages = _filterByUser(MyMessages);\n if (customFilter) {\n MyMessages = customFilter(MyMessages);\n }\n\n MyMessages = _handleReadMessages(MyMessages);\n\n // 由于强制插入的未读消息更改了时间,因此需要重新排序\n MyMessages = MyMessages.sort((a: Message, b: Message) => {\n let dateA = new Date(a.updatedAt).getTime();\n let dateB = new Date(b.updatedAt).getTime();\n return dateB - dateA;\n });\n console.log('Message 处理完毕');\n isDataReady = true;\n MessageModel.emitChange();\n};\n\nexport type MessageFilter = (oldMessage: Message[]) => Message[];\n\nexport const MessageModel = {\n init: (customFilter?: MessageFilter) => {\n // 不需要监听 VIP 了,因为 Config 回调意味着 VIP 信息已经 Ready\n ConfigDataModel.addListener(() => {\n if (!isConfigStateReady) {\n isConfigStateReady = true;\n _handleResponse(customFilter);\n }\n });\n\n Notification.addListener(\n 'onLogin',\n ({ isAuto, user, error }: LoginResultDataType) => {\n if (!isAuto && user && !error) {\n isDataReady = false;\n isConfigStateReady = false;\n isNetwordDataReady = false;\n OnlineItems = [];\n MessageModel.fetch(customFilter);\n }\n }\n );\n\n MessageModel.fetch(customFilter);\n },\n\n fetch: (customFilter?: MessageFilter) => {\n // 确保可重入,但如果网络一直出错的话,每次调用都会一直发\n if (isNetwordDataReady) {\n return;\n }\n\n const query = new AV.Query('Message');\n query\n .equalTo('valid', true)\n .equalTo(Platform.OS, true)\n .descending('updatedAt');\n query\n .find()\n .then(async (items: Object[]) => {\n console.log('Message 抓取完毕');\n isNetwordDataReady = true;\n OnlineItems = items;\n _handleResponse(customFilter);\n })\n .catch((e: any) => {\n console.error(e);\n });\n },\n\n getUnreadMessages: (): Message[] => {\n return MyMessages.filter((item) => !item.isRead);\n },\n\n getAllMessages: (): Message[] => {\n return MyMessages;\n },\n\n markMessageRead: async (message: Message) => {\n if (message.isRead || !message.objectId) {\n return;\n }\n message.isRead = true;\n\n if (message.key) {\n const freConfig: FreConfigType = {\n key: message.key,\n limit: message.limit,\n gap: message.gap,\n };\n // 能被展示出来的 message 一定是符合 FrequenceManager.canRun 的\n if (freConfig.gap) {\n FrequenceManager.markFinishForTime(freConfig);\n } else if (freConfig.limit) {\n FrequenceManager.markFinishForCount(freConfig);\n }\n }\n\n const readMsgs = PrefData.getValue(BuildInPrefs.Messages);\n readMsgs.push(message.objectId);\n await PrefData.setValue(BuildInPrefs.Messages, readMsgs);\n MessageModel.emitChange();\n },\n\n emitChange: () => {\n eventEmitter.emit('change', MyMessages.slice());\n },\n\n addListenerOnce: (callback: Function) => {\n if (isDataReady) {\n callback && callback();\n return;\n }\n eventEmitter.once('change', callback);\n },\n\n addListener: (callback: Function) => {\n if (isDataReady) {\n callback && callback();\n return callback;\n }\n eventEmitter.on('change', callback);\n return callback;\n },\n\n removeListener: (callback: Function) => {\n eventEmitter.removeListener('change', callback);\n },\n};\n"],"mappings":"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"}
|
1
|
+
{"version":3,"names":["_reactNative","require","_reactNativeDeviceInfo","_ConfigDataModel","_Frequence","_LoginManager","_Notification","_PrefData","_Tool","_VersionManager","_interopRequireDefault","_VipManager","obj","__esModule","default","AV","EventEmitter","eventEmitter","semverGt","semverGte","semverCoerce","MyMessages","_filterByVersion","items","ret","curVer","getReadableVersion","version","item","_item$minVer","_item$maxVer","minVer","trim","maxVer","push","_filterByVip","isVip","VipManager","isForeverVip","vipFilter","_filterByUser","users","length","LoginManager","isLogin","_LoginManager$current","includes","currentUser","AVUser","get","_handleReadMessages","__DEV__","readMsgs","PrefData","getValue","BuildInPrefs","Messages","objectId","isRead","_item$key","key","ConfigDataModel","VersionManager","hasNewAppVer","updatedAt","Date","toString","freConfig","limit","gap","FrequenceManager","canRun","configValue","_getConfigValue","lastTimestamp","isDataReady","isConfigStateReady","isVipStateReady","isNetwordDataReady","OnlineItems","_handleResponse","customFilter","isDanger","map","Tool","jsonify","sort","a","b","dateA","getTime","dateB","console","log","MessageModel","emitChange","exports","init","Notification","addListener","_ref","isAuto","user","error","fetch","query","Query","equalTo","Platform","OS","descending","find","then","catch","e","getUnreadMessages","filter","getAllMessages","markMessageRead","message","markFinishForTime","markFinishForCount","setValue","emit","slice","addListenerOnce","callback","once","on","removeListener"],"sources":["MessageModel.ts"],"sourcesContent":["import { Object } from 'leancloud-storage';\nimport { Platform } from 'react-native';\nimport { getReadableVersion } from 'react-native-device-info';\nimport { ConfigDataModel } from './ConfigDataModel';\nimport { FreConfigType, FrequenceManager } from './Frequence';\nimport { LoginManager, LoginResultDataType } from './LoginManager';\nimport { Notification } from './Notification';\nimport { BuildInPrefs, PrefData } from './PrefData';\nimport { Tool } from './Tool';\nimport VersionManager from './VersionManager';\nimport { VipManager } from './VipManager';\n\nconst AV = require('leancloud-storage');\nconst EventEmitter = require('events').EventEmitter;\nconst eventEmitter = new EventEmitter();\nconst semverGt = require('semver/functions/gt');\nconst semverGte = require('semver/functions/gte');\nconst semverCoerce = require('semver/functions/coerce');\n\nexport interface Message {\n objectId: string;\n android: boolean;\n ios: boolean;\n title?: string;\n content?: string;\n maxVer?: string;\n minVer?: string;\n key?: string;\n updatedAt: string;\n valid: boolean;\n vipFilter?: number;\n isRead: boolean;\n users?: string[];\n limit?: number;\n gap?: number;\n url: string;\n actionTitle?: string;\n}\n\nlet MyMessages: Message[] = [];\n\nconst _filterByVersion = (items: Message[]): Message[] => {\n let ret: Message[] = [];\n const curVer = semverCoerce(getReadableVersion()).version;\n for (const item of items) {\n const minVer = item.minVer?.trim();\n const maxVer = item.maxVer?.trim();\n // 确保 cur 处于 [minVer, maxVer)\n if (!!minVer && semverGt(semverCoerce(minVer).version, curVer)) {\n continue;\n }\n if (!!maxVer && semverGte(curVer, semverCoerce(maxVer).version)) {\n continue;\n }\n\n ret.push(item);\n }\n return ret;\n};\n\nconst _filterByVip = (items: Message[]): Message[] => {\n let ret: Message[] = [];\n const isVip = VipManager.isVip();\n const isForeverVip = VipManager.isForeverVip();\n for (const item of items) {\n const vipFilter = item.vipFilter;\n if (\n vipFilter === 0 ||\n (vipFilter === 1 && !isVip) ||\n (vipFilter === 2 && !isForeverVip)\n ) {\n ret.push(item);\n }\n }\n return ret;\n};\n\nconst _filterByUser = (items: Message[]): Message[] => {\n let ret: Message[] = [];\n for (const item of items) {\n const users = item.users;\n if (users?.length) {\n if (LoginManager.isLogin()) {\n if (\n users?.includes(LoginManager.currentUser()?.AVUser.get('objectId'))\n ) {\n ret.push(item);\n }\n }\n } else {\n ret.push(item);\n }\n }\n return ret;\n};\n\nconst _handleReadMessages = (items: Message[]): Message[] => {\n if (__DEV__) {\n // return items;\n }\n\n // 根据已读状态标为已读\n const readMsgs = PrefData.getValue(BuildInPrefs.Messages);\n for (const item of items) {\n if (readMsgs.includes(item.objectId)) {\n item.isRead = true;\n }\n }\n\n // 挑选需要强制未读\n for (const item of items) {\n if (!item.isRead) {\n continue;\n }\n if (item.key === 'changeLog') {\n // 强制升级弹窗\n // Message 是在 Config 回包之后再请求的,因此此时 Config 的值一定是准确的\n if (\n ConfigDataModel.get('upgrade_alert') &&\n VersionManager.hasNewAppVer()\n ) {\n item.isRead = false;\n item.updatedAt = new Date().toString();\n }\n } else if (item.key?.length) {\n // 如果是带 Key 的,那么会根据 limit 或 gap 再给一次标为未读的机会\n const freConfig: FreConfigType = {\n key: item.key,\n limit: item.limit,\n gap: item.gap,\n };\n if (FrequenceManager.canRun(freConfig)) {\n item.isRead = false;\n item.updatedAt = new Date().toString();\n } else {\n const configValue = FrequenceManager._getConfigValue(freConfig);\n if (configValue.lastTimestamp) {\n item.updatedAt = new Date(\n configValue.lastTimestamp * 1000\n ).toString();\n }\n }\n }\n }\n\n return items;\n};\n\nlet isDataReady = false;\nlet isConfigStateReady = false;\nlet isVipStateReady = false;\nlet isNetwordDataReady = false;\nlet OnlineItems: Object[] = [];\n\nconst _handleResponse = (customFilter?: MessageFilter) => {\n if (\n !isConfigStateReady ||\n !OnlineItems.length ||\n !isNetwordDataReady ||\n !isVipStateReady\n ) {\n return;\n }\n\n if (VersionManager.isDanger()) {\n return;\n }\n\n MyMessages = OnlineItems.map((item) => Tool.jsonify(item));\n MyMessages = _filterByVersion(MyMessages);\n MyMessages = _filterByVip(MyMessages);\n MyMessages = _filterByUser(MyMessages);\n if (customFilter) {\n MyMessages = customFilter(MyMessages);\n }\n\n MyMessages = _handleReadMessages(MyMessages);\n\n // 由于强制插入的未读消息更改了时间,因此需要重新排序\n MyMessages = MyMessages.sort((a: Message, b: Message) => {\n let dateA = new Date(a.updatedAt).getTime();\n let dateB = new Date(b.updatedAt).getTime();\n return dateB - dateA;\n });\n console.log('Message 处理完毕');\n isDataReady = true;\n MessageModel.emitChange();\n};\n\nexport type MessageFilter = (oldMessage: Message[]) => Message[];\n\nexport const MessageModel = {\n init: (customFilter?: MessageFilter) => {\n Notification.addListener('onVipRefresh', () => {\n // 监听多次,直到成功,整个生命周期最多处理一次\n if (!isVipStateReady) {\n isVipStateReady = true;\n _handleResponse(customFilter);\n }\n });\n\n ConfigDataModel.addListener(() => {\n if (!isConfigStateReady) {\n isConfigStateReady = true;\n _handleResponse(customFilter);\n }\n });\n\n Notification.addListener(\n 'onLogin',\n ({ isAuto, user, error }: LoginResultDataType) => {\n if (!isAuto && user && !error) {\n isDataReady = false;\n isConfigStateReady = false;\n isVipStateReady = false;\n isNetwordDataReady = false;\n OnlineItems = [];\n MessageModel.fetch(customFilter);\n }\n }\n );\n\n MessageModel.fetch(customFilter);\n },\n\n fetch: (customFilter?: MessageFilter) => {\n // 确保可重入,但如果网络一直出错的话,每次调用都会一直发\n if (isNetwordDataReady) {\n return;\n }\n\n const query = new AV.Query('Message');\n query\n .equalTo('valid', true)\n .equalTo(Platform.OS, true)\n .descending('updatedAt');\n query\n .find()\n .then(async (items: Object[]) => {\n console.log('Message 抓取完毕');\n isNetwordDataReady = true;\n OnlineItems = items;\n _handleResponse(customFilter);\n })\n .catch((e: any) => {\n console.error(e);\n });\n },\n\n getUnreadMessages: (): Message[] => {\n return MyMessages.filter((item) => !item.isRead);\n },\n\n getAllMessages: (): Message[] => {\n return MyMessages;\n },\n\n markMessageRead: async (message: Message) => {\n if (message.isRead || !message.objectId) {\n return;\n }\n message.isRead = true;\n\n if (message.key) {\n const freConfig: FreConfigType = {\n key: message.key,\n limit: message.limit,\n gap: message.gap,\n };\n // 能被展示出来的 message 一定是符合 FrequenceManager.canRun 的\n if (freConfig.gap) {\n FrequenceManager.markFinishForTime(freConfig);\n } else if (freConfig.limit) {\n FrequenceManager.markFinishForCount(freConfig);\n }\n }\n\n const readMsgs = PrefData.getValue(BuildInPrefs.Messages);\n readMsgs.push(message.objectId);\n await PrefData.setValue(BuildInPrefs.Messages, readMsgs);\n MessageModel.emitChange();\n },\n\n emitChange: () => {\n eventEmitter.emit('change', MyMessages.slice());\n },\n\n addListenerOnce: (callback: Function) => {\n if (isDataReady) {\n callback && callback();\n return;\n }\n eventEmitter.once('change', callback);\n },\n\n addListener: (callback: Function) => {\n if (isDataReady) {\n callback && callback();\n return callback;\n }\n eventEmitter.on('change', callback);\n return callback;\n },\n\n removeListener: (callback: Function) => {\n eventEmitter.removeListener('change', callback);\n },\n};\n"],"mappings":"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"}
|
@@ -0,0 +1,77 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
4
|
+
value: true
|
5
|
+
});
|
6
|
+
exports.default = void 0;
|
7
|
+
var _reactNativeDeviceInfo = require("react-native-device-info");
|
8
|
+
var _DevConfig = require("./DevConfig");
|
9
|
+
var _PrefData = require("./PrefData");
|
10
|
+
const semverGt = require('semver/functions/gt');
|
11
|
+
const semverGte = require('semver/functions/gte');
|
12
|
+
const semverCoerce = require('semver/functions/coerce');
|
13
|
+
let VersionInfo = {
|
14
|
+
currentAppVersion: semverCoerce((0, _reactNativeDeviceInfo.getReadableVersion)()).version,
|
15
|
+
currentBundleVersion: 1,
|
16
|
+
isDanger: false,
|
17
|
+
hasNewAppVersion: false,
|
18
|
+
hasNewBundleVersion: false
|
19
|
+
};
|
20
|
+
const VersionManager = {
|
21
|
+
init: _ref => {
|
22
|
+
let {
|
23
|
+
latestAppVersion,
|
24
|
+
latestBundleVersion
|
25
|
+
} = _ref;
|
26
|
+
if (latestAppVersion) {
|
27
|
+
const onlineVersion = semverCoerce(latestAppVersion).version;
|
28
|
+
// online > current,才有新版本
|
29
|
+
if (semverGt(onlineVersion, VersionInfo.currentAppVersion)) {
|
30
|
+
VersionInfo.hasNewAppVersion = true;
|
31
|
+
}
|
32
|
+
// current > online,就危险
|
33
|
+
if (semverGt(VersionInfo.currentAppVersion, onlineVersion)) {
|
34
|
+
VersionInfo.isDanger = true;
|
35
|
+
}
|
36
|
+
}
|
37
|
+
if (__DEV__ && _DevConfig.DevConfig.hasValue(_PrefData.BuildInPrefs.DevDanger)) {
|
38
|
+
VersionInfo.isDanger = _DevConfig.DevConfig.getValue(_PrefData.BuildInPrefs.DevDanger);
|
39
|
+
}
|
40
|
+
if (latestBundleVersion) {
|
41
|
+
const onlineVersion = semverCoerce(latestBundleVersion).version;
|
42
|
+
if (semverGt(onlineVersion, VersionInfo.currentBundleVersion)) {
|
43
|
+
VersionInfo.hasNewBundleVersion = true;
|
44
|
+
}
|
45
|
+
}
|
46
|
+
},
|
47
|
+
isDanger: () => {
|
48
|
+
return VersionInfo.isDanger;
|
49
|
+
},
|
50
|
+
appVer: () => {
|
51
|
+
return VersionInfo.currentAppVersion;
|
52
|
+
},
|
53
|
+
bundleVer: () => {
|
54
|
+
return VersionInfo.currentBundleVersion;
|
55
|
+
},
|
56
|
+
hasNewAppVer: () => {
|
57
|
+
return VersionInfo.hasNewAppVersion;
|
58
|
+
},
|
59
|
+
hasNewBundleVer: () => {
|
60
|
+
return VersionInfo.hasNewBundleVersion;
|
61
|
+
},
|
62
|
+
isValidVersion: (minVer, maxVer) => {
|
63
|
+
var _minVer, _maxVer;
|
64
|
+
minVer = (_minVer = minVer) === null || _minVer === void 0 ? void 0 : _minVer.trim();
|
65
|
+
maxVer = (_maxVer = maxVer) === null || _maxVer === void 0 ? void 0 : _maxVer.trim();
|
66
|
+
// 确保 cur 处于 [minVer, maxVer)
|
67
|
+
if (!!minVer && semverGt(semverCoerce(minVer).version, VersionManager.appVer())) {
|
68
|
+
return false;
|
69
|
+
}
|
70
|
+
if (!!maxVer && semverGte(VersionManager.appVer(), semverCoerce(maxVer).version)) {
|
71
|
+
return false;
|
72
|
+
}
|
73
|
+
return true;
|
74
|
+
}
|
75
|
+
};
|
76
|
+
var _default = exports.default = VersionManager;
|
77
|
+
//# sourceMappingURL=VersionManager.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"names":["_reactNativeDeviceInfo","require","_DevConfig","_PrefData","semverGt","semverGte","semverCoerce","VersionInfo","currentAppVersion","getReadableVersion","version","currentBundleVersion","isDanger","hasNewAppVersion","hasNewBundleVersion","VersionManager","init","_ref","latestAppVersion","latestBundleVersion","onlineVersion","__DEV__","DevConfig","hasValue","BuildInPrefs","DevDanger","getValue","appVer","bundleVer","hasNewAppVer","hasNewBundleVer","isValidVersion","minVer","maxVer","_minVer","_maxVer","trim","_default","exports","default"],"sources":["VersionManager.ts"],"sourcesContent":["import { getReadableVersion } from 'react-native-device-info';\nimport { DevConfig } from './DevConfig';\nimport { BuildInPrefs } from './PrefData';\n\nconst semverGt = require('semver/functions/gt');\nconst semverGte = require('semver/functions/gte');\nconst semverCoerce = require('semver/functions/coerce');\n\nlet VersionInfo = {\n currentAppVersion: semverCoerce(getReadableVersion()).version,\n currentBundleVersion: 1,\n isDanger: false,\n hasNewAppVersion: false,\n hasNewBundleVersion: false,\n};\n\nconst VersionManager = {\n init: ({\n latestAppVersion,\n latestBundleVersion,\n }: {\n latestAppVersion: string;\n latestBundleVersion?: string;\n }) => {\n if (latestAppVersion) {\n const onlineVersion = semverCoerce(latestAppVersion).version;\n // online > current,才有新版本\n if (semverGt(onlineVersion, VersionInfo.currentAppVersion)) {\n VersionInfo.hasNewAppVersion = true;\n }\n // current > online,就危险\n if (semverGt(VersionInfo.currentAppVersion, onlineVersion)) {\n VersionInfo.isDanger = true;\n }\n }\n\n if (__DEV__ && DevConfig.hasValue(BuildInPrefs.DevDanger)) {\n VersionInfo.isDanger = DevConfig.getValue(BuildInPrefs.DevDanger);\n }\n\n if (latestBundleVersion) {\n const onlineVersion = semverCoerce(latestBundleVersion).version;\n if (semverGt(onlineVersion, VersionInfo.currentBundleVersion)) {\n VersionInfo.hasNewBundleVersion = true;\n }\n }\n },\n\n isDanger: () => {\n return VersionInfo.isDanger;\n },\n\n appVer: () => {\n return VersionInfo.currentAppVersion;\n },\n\n bundleVer: () => {\n return VersionInfo.currentBundleVersion;\n },\n\n hasNewAppVer: () => {\n return VersionInfo.hasNewAppVersion;\n },\n\n hasNewBundleVer: () => {\n return VersionInfo.hasNewBundleVersion;\n },\n\n isValidVersion: (minVer?: string, maxVer?: string) => {\n minVer = minVer?.trim();\n maxVer = maxVer?.trim();\n // 确保 cur 处于 [minVer, maxVer)\n if (\n !!minVer &&\n semverGt(semverCoerce(minVer).version, VersionManager.appVer())\n ) {\n return false;\n }\n if (\n !!maxVer &&\n semverGte(VersionManager.appVer(), semverCoerce(maxVer).version)\n ) {\n return false;\n }\n return true;\n },\n};\nexport default VersionManager;\n"],"mappings":"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"}
|
@@ -1,35 +1,16 @@
|
|
1
1
|
import { Platform } from 'react-native';
|
2
|
-
import { getReadableVersion } from 'react-native-device-info';
|
3
|
-
import { DevConfig } from './DevConfig';
|
4
2
|
import { LoginManager } from './LoginManager';
|
5
3
|
import { Notification } from './Notification';
|
6
|
-
import
|
4
|
+
import VersionManager from './VersionManager';
|
7
5
|
import { VipAndroidManager } from './VipAndroidManager';
|
8
6
|
const EventEmitter = require('events').EventEmitter;
|
9
7
|
const eventEmitter = new EventEmitter();
|
10
|
-
const semverGt = require('semver/functions/gt');
|
11
|
-
const semverGte = require('semver/functions/gte');
|
12
|
-
const semverCoerce = require('semver/functions/coerce');
|
13
8
|
let MyItems = {};
|
14
|
-
let VersionInfo = {
|
15
|
-
currentVersion: semverCoerce(getReadableVersion()).version,
|
16
|
-
latestVersion: semverCoerce(getReadableVersion()).version,
|
17
|
-
isDanger: false,
|
18
|
-
hasNewVersion: false
|
19
|
-
};
|
20
9
|
const AV = require('leancloud-storage');
|
21
10
|
const _filterByVersion = items => {
|
22
11
|
let ret = [];
|
23
|
-
const curVer = semverCoerce(getReadableVersion()).version;
|
24
12
|
for (const item of items) {
|
25
|
-
|
26
|
-
const minVer = (_item$get = item.get('minVer')) === null || _item$get === void 0 ? void 0 : _item$get.trim();
|
27
|
-
const maxVer = (_item$get2 = item.get('maxVer')) === null || _item$get2 === void 0 ? void 0 : _item$get2.trim();
|
28
|
-
// 确保 cur 处于 [minVer, maxVer)
|
29
|
-
if (!!minVer && semverGt(semverCoerce(minVer).version, curVer)) {
|
30
|
-
continue;
|
31
|
-
}
|
32
|
-
if (!!maxVer && semverGte(curVer, semverCoerce(maxVer).version)) {
|
13
|
+
if (!VersionManager.isValidVersion(item.get('minVer'), item.get('maxVer'))) {
|
33
14
|
continue;
|
34
15
|
}
|
35
16
|
ret.push(item);
|
@@ -47,29 +28,10 @@ const _updateKeyValues = items => {
|
|
47
28
|
}
|
48
29
|
};
|
49
30
|
const handleVersionInfo = () => {
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
}
|
55
|
-
const configVersion = ConfigDataModel.get(key);
|
56
|
-
if (configVersion) {
|
57
|
-
const onlineVersion = semverCoerce(configVersion).version;
|
58
|
-
// current < online,才有新版本
|
59
|
-
if (semverGt(onlineVersion, VersionInfo.currentVersion)) {
|
60
|
-
VersionInfo.latestVersion = onlineVersion;
|
61
|
-
VersionInfo.hasNewVersion = true;
|
62
|
-
}
|
63
|
-
// current <= online,才安全 ,防止忘记修改 online
|
64
|
-
if (semverGt(VersionInfo.currentVersion, onlineVersion)) {
|
65
|
-
VersionInfo.isDanger = true;
|
66
|
-
}
|
67
|
-
}
|
68
|
-
if (__DEV__) {
|
69
|
-
if (DevConfig.hasValue(BuildInPrefs.DevDanger)) {
|
70
|
-
VersionInfo.isDanger = DevConfig.getValue(BuildInPrefs.DevDanger);
|
71
|
-
}
|
72
|
-
}
|
31
|
+
VersionManager.init({
|
32
|
+
latestAppVersion: ConfigDataModel.get(Platform.OS === 'android' ? 'aov' : 'ov'),
|
33
|
+
latestBundleVersion: ConfigDataModel.get('bov')
|
34
|
+
});
|
73
35
|
};
|
74
36
|
let isDataReady = false;
|
75
37
|
let isNetwordDataReady = false;
|
@@ -122,9 +84,6 @@ const ConfigDataModel = {
|
|
122
84
|
console.error(e);
|
123
85
|
});
|
124
86
|
},
|
125
|
-
getVersionConfig: () => {
|
126
|
-
return VersionInfo;
|
127
|
-
},
|
128
87
|
get: key => {
|
129
88
|
return MyItems[key];
|
130
89
|
},
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":["Platform","getReadableVersion","DevConfig","LoginManager","Notification","BuildInPrefs","VipAndroidManager","EventEmitter","require","eventEmitter","semverGt","semverGte","semverCoerce","MyItems","VersionInfo","currentVersion","version","latestVersion","isDanger","hasNewVersion","AV","_filterByVersion","items","ret","curVer","item","_item$get","_item$get2","minVer","get","trim","maxVer","push","_updateKeyValues","value","handleVersionInfo","key","OS","configVersion","ConfigDataModel","onlineVersion","__DEV__","hasValue","DevDanger","getValue","isDataReady","isNetwordDataReady","_handleResponse","OnlineItems","console","log","setOfferings","emitChange","init","defaultValues","addListener","_ref","isAuto","user","error","fetch","query","Query","equalTo","find","then","catch","e","getVersionConfig","emit","addListenerOnce","callback","once","on","shouldEnableByRate","enable","rate","_LoginManager$current","_LoginManager$current2","r","lastChar","currentUser","AVUser","slice","indexOf","toLowerCase"],"sources":["ConfigDataModel.ts"],"sourcesContent":["import { Object } from 'leancloud-storage';\nimport { Platform } from 'react-native';\nimport { getReadableVersion } from 'react-native-device-info';\nimport { DevConfig } from './DevConfig';\nimport { LoginManager, LoginResultDataType } from './LoginManager';\nimport { Notification } from './Notification';\nimport { BuildInPrefs } from './PrefData';\nimport { VipAndroidManager } from './VipAndroidManager';\n\nconst EventEmitter = require('events').EventEmitter;\nconst eventEmitter = new EventEmitter();\nconst semverGt = require('semver/functions/gt');\nconst semverGte = require('semver/functions/gte');\nconst semverCoerce = require('semver/functions/coerce');\n\nexport interface ConfigsType {\n [key: string]: any;\n}\nlet MyItems: ConfigsType = {};\nlet VersionInfo = {\n currentVersion: semverCoerce(getReadableVersion()).version,\n latestVersion: semverCoerce(getReadableVersion()).version,\n isDanger: false,\n hasNewVersion: false,\n};\n\nconst AV = require('leancloud-storage');\n\nconst _filterByVersion = (items: Object[]) => {\n let ret = [];\n const curVer = semverCoerce(getReadableVersion()).version;\n for (const item of items) {\n const minVer = item.get('minVer')?.trim();\n const maxVer = item.get('maxVer')?.trim();\n // 确保 cur 处于 [minVer, maxVer)\n if (!!minVer && semverGt(semverCoerce(minVer).version, curVer)) {\n continue;\n }\n if (!!maxVer && semverGte(curVer, semverCoerce(maxVer).version)) {\n continue;\n }\n\n ret.push(item);\n }\n return ret;\n};\n\nconst _updateKeyValues = (items: Object[]) => {\n for (const item of items) {\n let value = item.get('value');\n if (typeof value === 'string') {\n // 因为 leancloud 无法配置空白内容,所以 trim 下,这样就能以空格代替空白{\n value = value.trim();\n }\n MyItems[item.get('key')] = value;\n }\n};\n\nconst handleVersionInfo = () => {\n // online > current,则更新 latestVersion\n let key = 'ov';\n if (Platform.OS === 'android') {\n key = 'aov';\n }\n const configVersion = ConfigDataModel.get(key);\n if (configVersion) {\n const onlineVersion = semverCoerce(configVersion).version;\n // current < online,才有新版本\n if (semverGt(onlineVersion, VersionInfo.currentVersion)) {\n VersionInfo.latestVersion = onlineVersion;\n VersionInfo.hasNewVersion = true;\n }\n // current <= online,才安全 ,防止忘记修改 online\n if (semverGt(VersionInfo.currentVersion, onlineVersion)) {\n VersionInfo.isDanger = true;\n }\n }\n\n if (__DEV__) {\n if (DevConfig.hasValue(BuildInPrefs.DevDanger)) {\n VersionInfo.isDanger = DevConfig.getValue(BuildInPrefs.DevDanger);\n }\n }\n};\n\nlet isDataReady = false;\nlet isNetwordDataReady = false;\n\nconst _handleResponse = (OnlineItems: Object[]) => {\n if (!isNetwordDataReady) {\n return;\n }\n\n // 根据版本过滤\n let items = _filterByVersion(OnlineItems);\n _updateKeyValues(items);\n // 处理 Version 信息\n handleVersionInfo();\n console.log('Config 处理完毕');\n isDataReady = true;\n VipAndroidManager.setOfferings(ConfigDataModel.get('vip_android_offerings'));\n ConfigDataModel.emitChange();\n};\n\n// ConfigDataModel 的 Config 是支持后台配置多条同一个 Key 的,按版本区分\nconst ConfigDataModel = {\n init: (defaultValues: ConfigsType) => {\n MyItems = defaultValues;\n\n Notification.addListener(\n 'onLogin',\n ({ isAuto, user, error }: LoginResultDataType) => {\n if (!isAuto && user && !error) {\n isDataReady = false;\n isNetwordDataReady = false;\n ConfigDataModel.fetch();\n }\n }\n );\n\n ConfigDataModel.fetch();\n },\n\n fetch: () => {\n // 确保可重入,但如果网络一直出错的话,每次调用都会一直发\n if (isNetwordDataReady) {\n return;\n }\n\n const query = new AV.Query('Configs');\n query.equalTo('valid', true).equalTo(Platform.OS, true);\n query\n .find()\n .then((items: Object[]) => {\n console.log('Config 抓取完毕');\n isNetwordDataReady = true;\n _handleResponse(items);\n })\n .catch((e: any) => {\n console.error(e);\n });\n },\n\n getVersionConfig: () => {\n return VersionInfo;\n },\n\n get: (key: string) => {\n return MyItems[key];\n },\n\n emitChange: () => {\n eventEmitter.emit('change');\n },\n\n addListenerOnce: (callback: Function) => {\n if (isDataReady) {\n callback && callback();\n return;\n }\n eventEmitter.once('change', callback);\n },\n\n addListener: (callback: Function) => {\n if (isDataReady) {\n callback && callback();\n return;\n }\n eventEmitter.on('change', callback);\n },\n\n shouldEnableByRate: (enable?: boolean, rate?: number) => {\n if (!enable) {\n return false;\n }\n // rate 不传,默认为全量\n const r = rate ?? 1;\n if (r <= 0) {\n return false;\n }\n // ID 最后一位是 16 进制(0-f),未登录默认为全量\n const lastChar =\n LoginManager.currentUser()?.AVUser?.get('objectId')?.slice(-1) ?? '0';\n return '0123456789abcdef'.indexOf(lastChar.toLowerCase()) < r * 16;\n },\n};\n\nexport { ConfigDataModel };\n"],"mappings":"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"}
|
1
|
+
{"version":3,"names":["Platform","LoginManager","Notification","VersionManager","VipAndroidManager","EventEmitter","require","eventEmitter","MyItems","AV","_filterByVersion","items","ret","item","isValidVersion","get","push","_updateKeyValues","value","trim","handleVersionInfo","init","latestAppVersion","ConfigDataModel","OS","latestBundleVersion","isDataReady","isNetwordDataReady","_handleResponse","OnlineItems","console","log","setOfferings","emitChange","defaultValues","addListener","_ref","isAuto","user","error","fetch","query","Query","equalTo","find","then","catch","e","key","emit","addListenerOnce","callback","once","on","shouldEnableByRate","enable","rate","_LoginManager$current","_LoginManager$current2","r","lastChar","currentUser","AVUser","slice","indexOf","toLowerCase"],"sources":["ConfigDataModel.ts"],"sourcesContent":["import { Object } from 'leancloud-storage';\nimport { Platform } from 'react-native';\nimport { LoginManager, LoginResultDataType } from './LoginManager';\nimport { Notification } from './Notification';\nimport VersionManager from './VersionManager';\nimport { VipAndroidManager } from './VipAndroidManager';\n\nconst EventEmitter = require('events').EventEmitter;\nconst eventEmitter = new EventEmitter();\n\nexport interface ConfigsType {\n [key: string]: any;\n}\nlet MyItems: ConfigsType = {};\n\nconst AV = require('leancloud-storage');\n\nconst _filterByVersion = (items: Object[]) => {\n let ret = [];\n for (const item of items) {\n if (\n !VersionManager.isValidVersion(item.get('minVer'), item.get('maxVer'))\n ) {\n continue;\n }\n ret.push(item);\n }\n return ret;\n};\n\nconst _updateKeyValues = (items: Object[]) => {\n for (const item of items) {\n let value = item.get('value');\n if (typeof value === 'string') {\n // 因为 leancloud 无法配置空白内容,所以 trim 下,这样就能以空格代替空白{\n value = value.trim();\n }\n MyItems[item.get('key')] = value;\n }\n};\n\nconst handleVersionInfo = () => {\n VersionManager.init({\n latestAppVersion: ConfigDataModel.get(\n Platform.OS === 'android' ? 'aov' : 'ov'\n ),\n latestBundleVersion: ConfigDataModel.get('bov'),\n });\n};\n\nlet isDataReady = false;\nlet isNetwordDataReady = false;\n\nconst _handleResponse = (OnlineItems: Object[]) => {\n if (!isNetwordDataReady) {\n return;\n }\n\n // 根据版本过滤\n let items = _filterByVersion(OnlineItems);\n _updateKeyValues(items);\n // 处理 Version 信息\n handleVersionInfo();\n console.log('Config 处理完毕');\n isDataReady = true;\n VipAndroidManager.setOfferings(ConfigDataModel.get('vip_android_offerings'));\n ConfigDataModel.emitChange();\n};\n\n// ConfigDataModel 的 Config 是支持后台配置多条同一个 Key 的,按版本区分\nconst ConfigDataModel = {\n init: (defaultValues: ConfigsType) => {\n MyItems = defaultValues;\n\n Notification.addListener(\n 'onLogin',\n ({ isAuto, user, error }: LoginResultDataType) => {\n if (!isAuto && user && !error) {\n isDataReady = false;\n isNetwordDataReady = false;\n ConfigDataModel.fetch();\n }\n }\n );\n\n ConfigDataModel.fetch();\n },\n\n fetch: () => {\n // 确保可重入,但如果网络一直出错的话,每次调用都会一直发\n if (isNetwordDataReady) {\n return;\n }\n\n const query = new AV.Query('Configs');\n query.equalTo('valid', true).equalTo(Platform.OS, true);\n query\n .find()\n .then((items: Object[]) => {\n console.log('Config 抓取完毕');\n isNetwordDataReady = true;\n _handleResponse(items);\n })\n .catch((e: any) => {\n console.error(e);\n });\n },\n\n get: (key: string) => {\n return MyItems[key];\n },\n\n emitChange: () => {\n eventEmitter.emit('change');\n },\n\n addListenerOnce: (callback: Function) => {\n if (isDataReady) {\n callback && callback();\n return;\n }\n eventEmitter.once('change', callback);\n },\n\n addListener: (callback: Function) => {\n if (isDataReady) {\n callback && callback();\n return;\n }\n eventEmitter.on('change', callback);\n },\n\n shouldEnableByRate: (enable?: boolean, rate?: number) => {\n if (!enable) {\n return false;\n }\n // rate 不传,默认为全量\n const r = rate ?? 1;\n if (r <= 0) {\n return false;\n }\n // ID 最后一位是 16 进制(0-f),未登录默认为全量\n const lastChar =\n LoginManager.currentUser()?.AVUser?.get('objectId')?.slice(-1) ?? '0';\n return '0123456789abcdef'.indexOf(lastChar.toLowerCase()) < r * 16;\n },\n};\n\nexport { ConfigDataModel };\n"],"mappings":"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"}
|
@@ -6,6 +6,7 @@ import { LoginManager } from './LoginManager';
|
|
6
6
|
import { Notification } from './Notification';
|
7
7
|
import { BuildInPrefs, PrefData } from './PrefData';
|
8
8
|
import { Tool } from './Tool';
|
9
|
+
import VersionManager from './VersionManager';
|
9
10
|
import { VipManager } from './VipManager';
|
10
11
|
const AV = require('leancloud-storage');
|
11
12
|
const EventEmitter = require('events').EventEmitter;
|
@@ -83,8 +84,7 @@ const _handleReadMessages = items => {
|
|
83
84
|
if (item.key === 'changeLog') {
|
84
85
|
// 强制升级弹窗
|
85
86
|
// Message 是在 Config 回包之后再请求的,因此此时 Config 的值一定是准确的
|
86
|
-
|
87
|
-
if (ConfigDataModel.get('upgrade_alert') && config.hasNewVersion) {
|
87
|
+
if (ConfigDataModel.get('upgrade_alert') && VersionManager.hasNewAppVer()) {
|
88
88
|
item.isRead = false;
|
89
89
|
item.updatedAt = new Date().toString();
|
90
90
|
}
|
@@ -110,14 +110,14 @@ const _handleReadMessages = items => {
|
|
110
110
|
};
|
111
111
|
let isDataReady = false;
|
112
112
|
let isConfigStateReady = false;
|
113
|
+
let isVipStateReady = false;
|
113
114
|
let isNetwordDataReady = false;
|
114
115
|
let OnlineItems = [];
|
115
116
|
const _handleResponse = customFilter => {
|
116
|
-
|
117
|
-
if (!isConfigStateReady || !OnlineItems.length || !isNetwordDataReady) {
|
117
|
+
if (!isConfigStateReady || !OnlineItems.length || !isNetwordDataReady || !isVipStateReady) {
|
118
118
|
return;
|
119
119
|
}
|
120
|
-
if (
|
120
|
+
if (VersionManager.isDanger()) {
|
121
121
|
return;
|
122
122
|
}
|
123
123
|
MyMessages = OnlineItems.map(item => Tool.jsonify(item));
|
@@ -141,7 +141,13 @@ const _handleResponse = customFilter => {
|
|
141
141
|
};
|
142
142
|
export const MessageModel = {
|
143
143
|
init: customFilter => {
|
144
|
-
|
144
|
+
Notification.addListener('onVipRefresh', () => {
|
145
|
+
// 监听多次,直到成功,整个生命周期最多处理一次
|
146
|
+
if (!isVipStateReady) {
|
147
|
+
isVipStateReady = true;
|
148
|
+
_handleResponse(customFilter);
|
149
|
+
}
|
150
|
+
});
|
145
151
|
ConfigDataModel.addListener(() => {
|
146
152
|
if (!isConfigStateReady) {
|
147
153
|
isConfigStateReady = true;
|
@@ -157,6 +163,7 @@ export const MessageModel = {
|
|
157
163
|
if (!isAuto && user && !error) {
|
158
164
|
isDataReady = false;
|
159
165
|
isConfigStateReady = false;
|
166
|
+
isVipStateReady = false;
|
160
167
|
isNetwordDataReady = false;
|
161
168
|
OnlineItems = [];
|
162
169
|
MessageModel.fetch(customFilter);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":["Platform","getReadableVersion","ConfigDataModel","FrequenceManager","LoginManager","Notification","BuildInPrefs","PrefData","Tool","VipManager","AV","require","EventEmitter","eventEmitter","semverGt","semverGte","semverCoerce","MyMessages","_filterByVersion","items","ret","curVer","version","item","_item$minVer","_item$maxVer","minVer","trim","maxVer","push","_filterByVip","isVip","isForeverVip","vipFilter","_filterByUser","users","length","isLogin","_LoginManager$current","includes","currentUser","AVUser","get","_handleReadMessages","__DEV__","readMsgs","getValue","Messages","objectId","isRead","_item$key","key","config","getVersionConfig","hasNewVersion","updatedAt","Date","toString","freConfig","limit","gap","canRun","configValue","_getConfigValue","lastTimestamp","isDataReady","isConfigStateReady","isNetwordDataReady","OnlineItems","_handleResponse","customFilter","_ConfigDataModel$getV","isDanger","map","jsonify","sort","a","b","dateA","getTime","dateB","console","log","MessageModel","emitChange","init","addListener","_ref","isAuto","user","error","fetch","query","Query","equalTo","OS","descending","find","then","catch","e","getUnreadMessages","filter","getAllMessages","markMessageRead","message","markFinishForTime","markFinishForCount","setValue","emit","slice","addListenerOnce","callback","once","on","removeListener"],"sources":["MessageModel.ts"],"sourcesContent":["import { Object } from 'leancloud-storage';\nimport { Platform } from 'react-native';\nimport { getReadableVersion } from 'react-native-device-info';\nimport { ConfigDataModel } from './ConfigDataModel';\nimport { FreConfigType, FrequenceManager } from './Frequence';\nimport { LoginManager, LoginResultDataType } from './LoginManager';\nimport { Notification } from './Notification';\nimport { BuildInPrefs, PrefData } from './PrefData';\nimport { Tool } from './Tool';\nimport { VipManager } from './VipManager';\n\nconst AV = require('leancloud-storage');\nconst EventEmitter = require('events').EventEmitter;\nconst eventEmitter = new EventEmitter();\nconst semverGt = require('semver/functions/gt');\nconst semverGte = require('semver/functions/gte');\nconst semverCoerce = require('semver/functions/coerce');\n\nexport interface Message {\n objectId: string;\n android: boolean;\n ios: boolean;\n title?: string;\n content?: string;\n maxVer?: string;\n minVer?: string;\n key?: string;\n updatedAt: string;\n valid: boolean;\n vipFilter?: number;\n isRead: boolean;\n users?: string[];\n limit?: number;\n gap?: number;\n url: string;\n actionTitle?: string;\n}\n\nlet MyMessages: Message[] = [];\n\nconst _filterByVersion = (items: Message[]): Message[] => {\n let ret: Message[] = [];\n const curVer = semverCoerce(getReadableVersion()).version;\n for (const item of items) {\n const minVer = item.minVer?.trim();\n const maxVer = item.maxVer?.trim();\n // 确保 cur 处于 [minVer, maxVer)\n if (!!minVer && semverGt(semverCoerce(minVer).version, curVer)) {\n continue;\n }\n if (!!maxVer && semverGte(curVer, semverCoerce(maxVer).version)) {\n continue;\n }\n\n ret.push(item);\n }\n return ret;\n};\n\nconst _filterByVip = (items: Message[]): Message[] => {\n let ret: Message[] = [];\n const isVip = VipManager.isVip();\n const isForeverVip = VipManager.isForeverVip();\n for (const item of items) {\n const vipFilter = item.vipFilter;\n if (\n vipFilter === 0 ||\n (vipFilter === 1 && !isVip) ||\n (vipFilter === 2 && !isForeverVip)\n ) {\n ret.push(item);\n }\n }\n return ret;\n};\n\nconst _filterByUser = (items: Message[]): Message[] => {\n let ret: Message[] = [];\n for (const item of items) {\n const users = item.users;\n if (users?.length) {\n if (LoginManager.isLogin()) {\n if (\n users?.includes(LoginManager.currentUser()?.AVUser.get('objectId'))\n ) {\n ret.push(item);\n }\n }\n } else {\n ret.push(item);\n }\n }\n return ret;\n};\n\nconst _handleReadMessages = (items: Message[]): Message[] => {\n if (__DEV__) {\n // return items;\n }\n\n // 根据已读状态标为已读\n const readMsgs = PrefData.getValue(BuildInPrefs.Messages);\n for (const item of items) {\n if (readMsgs.includes(item.objectId)) {\n item.isRead = true;\n }\n }\n\n // 挑选需要强制未读\n for (const item of items) {\n if (!item.isRead) {\n continue;\n }\n if (item.key === 'changeLog') {\n // 强制升级弹窗\n // Message 是在 Config 回包之后再请求的,因此此时 Config 的值一定是准确的\n const config = ConfigDataModel.getVersionConfig();\n if (ConfigDataModel.get('upgrade_alert') && config.hasNewVersion) {\n item.isRead = false;\n item.updatedAt = new Date().toString();\n }\n } else if (item.key?.length) {\n // 如果是带 Key 的,那么会根据 limit 或 gap 再给一次标为未读的机会\n const freConfig: FreConfigType = {\n key: item.key,\n limit: item.limit,\n gap: item.gap,\n };\n if (FrequenceManager.canRun(freConfig)) {\n item.isRead = false;\n item.updatedAt = new Date().toString();\n } else {\n const configValue = FrequenceManager._getConfigValue(freConfig);\n if (configValue.lastTimestamp) {\n item.updatedAt = new Date(\n configValue.lastTimestamp * 1000\n ).toString();\n }\n }\n }\n }\n\n return items;\n};\n\nlet isDataReady = false;\nlet isConfigStateReady = false;\nlet isNetwordDataReady = false;\nlet OnlineItems: Object[] = [];\n\nconst _handleResponse = (customFilter?: MessageFilter) => {\n if (!isConfigStateReady || !OnlineItems.length || !isNetwordDataReady) {\n return;\n }\n\n if (ConfigDataModel.getVersionConfig()?.isDanger) {\n return;\n }\n\n MyMessages = OnlineItems.map((item) => Tool.jsonify(item));\n MyMessages = _filterByVersion(MyMessages);\n MyMessages = _filterByVip(MyMessages);\n MyMessages = _filterByUser(MyMessages);\n if (customFilter) {\n MyMessages = customFilter(MyMessages);\n }\n\n MyMessages = _handleReadMessages(MyMessages);\n\n // 由于强制插入的未读消息更改了时间,因此需要重新排序\n MyMessages = MyMessages.sort((a: Message, b: Message) => {\n let dateA = new Date(a.updatedAt).getTime();\n let dateB = new Date(b.updatedAt).getTime();\n return dateB - dateA;\n });\n console.log('Message 处理完毕');\n isDataReady = true;\n MessageModel.emitChange();\n};\n\nexport type MessageFilter = (oldMessage: Message[]) => Message[];\n\nexport const MessageModel = {\n init: (customFilter?: MessageFilter) => {\n // 不需要监听 VIP 了,因为 Config 回调意味着 VIP 信息已经 Ready\n ConfigDataModel.addListener(() => {\n if (!isConfigStateReady) {\n isConfigStateReady = true;\n _handleResponse(customFilter);\n }\n });\n\n Notification.addListener(\n 'onLogin',\n ({ isAuto, user, error }: LoginResultDataType) => {\n if (!isAuto && user && !error) {\n isDataReady = false;\n isConfigStateReady = false;\n isNetwordDataReady = false;\n OnlineItems = [];\n MessageModel.fetch(customFilter);\n }\n }\n );\n\n MessageModel.fetch(customFilter);\n },\n\n fetch: (customFilter?: MessageFilter) => {\n // 确保可重入,但如果网络一直出错的话,每次调用都会一直发\n if (isNetwordDataReady) {\n return;\n }\n\n const query = new AV.Query('Message');\n query\n .equalTo('valid', true)\n .equalTo(Platform.OS, true)\n .descending('updatedAt');\n query\n .find()\n .then(async (items: Object[]) => {\n console.log('Message 抓取完毕');\n isNetwordDataReady = true;\n OnlineItems = items;\n _handleResponse(customFilter);\n })\n .catch((e: any) => {\n console.error(e);\n });\n },\n\n getUnreadMessages: (): Message[] => {\n return MyMessages.filter((item) => !item.isRead);\n },\n\n getAllMessages: (): Message[] => {\n return MyMessages;\n },\n\n markMessageRead: async (message: Message) => {\n if (message.isRead || !message.objectId) {\n return;\n }\n message.isRead = true;\n\n if (message.key) {\n const freConfig: FreConfigType = {\n key: message.key,\n limit: message.limit,\n gap: message.gap,\n };\n // 能被展示出来的 message 一定是符合 FrequenceManager.canRun 的\n if (freConfig.gap) {\n FrequenceManager.markFinishForTime(freConfig);\n } else if (freConfig.limit) {\n FrequenceManager.markFinishForCount(freConfig);\n }\n }\n\n const readMsgs = PrefData.getValue(BuildInPrefs.Messages);\n readMsgs.push(message.objectId);\n await PrefData.setValue(BuildInPrefs.Messages, readMsgs);\n MessageModel.emitChange();\n },\n\n emitChange: () => {\n eventEmitter.emit('change', MyMessages.slice());\n },\n\n addListenerOnce: (callback: Function) => {\n if (isDataReady) {\n callback && callback();\n return;\n }\n eventEmitter.once('change', callback);\n },\n\n addListener: (callback: Function) => {\n if (isDataReady) {\n callback && callback();\n return callback;\n }\n eventEmitter.on('change', callback);\n return callback;\n },\n\n removeListener: (callback: Function) => {\n eventEmitter.removeListener('change', callback);\n },\n};\n"],"mappings":"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"}
|
1
|
+
{"version":3,"names":["Platform","getReadableVersion","ConfigDataModel","FrequenceManager","LoginManager","Notification","BuildInPrefs","PrefData","Tool","VersionManager","VipManager","AV","require","EventEmitter","eventEmitter","semverGt","semverGte","semverCoerce","MyMessages","_filterByVersion","items","ret","curVer","version","item","_item$minVer","_item$maxVer","minVer","trim","maxVer","push","_filterByVip","isVip","isForeverVip","vipFilter","_filterByUser","users","length","isLogin","_LoginManager$current","includes","currentUser","AVUser","get","_handleReadMessages","__DEV__","readMsgs","getValue","Messages","objectId","isRead","_item$key","key","hasNewAppVer","updatedAt","Date","toString","freConfig","limit","gap","canRun","configValue","_getConfigValue","lastTimestamp","isDataReady","isConfigStateReady","isVipStateReady","isNetwordDataReady","OnlineItems","_handleResponse","customFilter","isDanger","map","jsonify","sort","a","b","dateA","getTime","dateB","console","log","MessageModel","emitChange","init","addListener","_ref","isAuto","user","error","fetch","query","Query","equalTo","OS","descending","find","then","catch","e","getUnreadMessages","filter","getAllMessages","markMessageRead","message","markFinishForTime","markFinishForCount","setValue","emit","slice","addListenerOnce","callback","once","on","removeListener"],"sources":["MessageModel.ts"],"sourcesContent":["import { Object } from 'leancloud-storage';\nimport { Platform } from 'react-native';\nimport { getReadableVersion } from 'react-native-device-info';\nimport { ConfigDataModel } from './ConfigDataModel';\nimport { FreConfigType, FrequenceManager } from './Frequence';\nimport { LoginManager, LoginResultDataType } from './LoginManager';\nimport { Notification } from './Notification';\nimport { BuildInPrefs, PrefData } from './PrefData';\nimport { Tool } from './Tool';\nimport VersionManager from './VersionManager';\nimport { VipManager } from './VipManager';\n\nconst AV = require('leancloud-storage');\nconst EventEmitter = require('events').EventEmitter;\nconst eventEmitter = new EventEmitter();\nconst semverGt = require('semver/functions/gt');\nconst semverGte = require('semver/functions/gte');\nconst semverCoerce = require('semver/functions/coerce');\n\nexport interface Message {\n objectId: string;\n android: boolean;\n ios: boolean;\n title?: string;\n content?: string;\n maxVer?: string;\n minVer?: string;\n key?: string;\n updatedAt: string;\n valid: boolean;\n vipFilter?: number;\n isRead: boolean;\n users?: string[];\n limit?: number;\n gap?: number;\n url: string;\n actionTitle?: string;\n}\n\nlet MyMessages: Message[] = [];\n\nconst _filterByVersion = (items: Message[]): Message[] => {\n let ret: Message[] = [];\n const curVer = semverCoerce(getReadableVersion()).version;\n for (const item of items) {\n const minVer = item.minVer?.trim();\n const maxVer = item.maxVer?.trim();\n // 确保 cur 处于 [minVer, maxVer)\n if (!!minVer && semverGt(semverCoerce(minVer).version, curVer)) {\n continue;\n }\n if (!!maxVer && semverGte(curVer, semverCoerce(maxVer).version)) {\n continue;\n }\n\n ret.push(item);\n }\n return ret;\n};\n\nconst _filterByVip = (items: Message[]): Message[] => {\n let ret: Message[] = [];\n const isVip = VipManager.isVip();\n const isForeverVip = VipManager.isForeverVip();\n for (const item of items) {\n const vipFilter = item.vipFilter;\n if (\n vipFilter === 0 ||\n (vipFilter === 1 && !isVip) ||\n (vipFilter === 2 && !isForeverVip)\n ) {\n ret.push(item);\n }\n }\n return ret;\n};\n\nconst _filterByUser = (items: Message[]): Message[] => {\n let ret: Message[] = [];\n for (const item of items) {\n const users = item.users;\n if (users?.length) {\n if (LoginManager.isLogin()) {\n if (\n users?.includes(LoginManager.currentUser()?.AVUser.get('objectId'))\n ) {\n ret.push(item);\n }\n }\n } else {\n ret.push(item);\n }\n }\n return ret;\n};\n\nconst _handleReadMessages = (items: Message[]): Message[] => {\n if (__DEV__) {\n // return items;\n }\n\n // 根据已读状态标为已读\n const readMsgs = PrefData.getValue(BuildInPrefs.Messages);\n for (const item of items) {\n if (readMsgs.includes(item.objectId)) {\n item.isRead = true;\n }\n }\n\n // 挑选需要强制未读\n for (const item of items) {\n if (!item.isRead) {\n continue;\n }\n if (item.key === 'changeLog') {\n // 强制升级弹窗\n // Message 是在 Config 回包之后再请求的,因此此时 Config 的值一定是准确的\n if (\n ConfigDataModel.get('upgrade_alert') &&\n VersionManager.hasNewAppVer()\n ) {\n item.isRead = false;\n item.updatedAt = new Date().toString();\n }\n } else if (item.key?.length) {\n // 如果是带 Key 的,那么会根据 limit 或 gap 再给一次标为未读的机会\n const freConfig: FreConfigType = {\n key: item.key,\n limit: item.limit,\n gap: item.gap,\n };\n if (FrequenceManager.canRun(freConfig)) {\n item.isRead = false;\n item.updatedAt = new Date().toString();\n } else {\n const configValue = FrequenceManager._getConfigValue(freConfig);\n if (configValue.lastTimestamp) {\n item.updatedAt = new Date(\n configValue.lastTimestamp * 1000\n ).toString();\n }\n }\n }\n }\n\n return items;\n};\n\nlet isDataReady = false;\nlet isConfigStateReady = false;\nlet isVipStateReady = false;\nlet isNetwordDataReady = false;\nlet OnlineItems: Object[] = [];\n\nconst _handleResponse = (customFilter?: MessageFilter) => {\n if (\n !isConfigStateReady ||\n !OnlineItems.length ||\n !isNetwordDataReady ||\n !isVipStateReady\n ) {\n return;\n }\n\n if (VersionManager.isDanger()) {\n return;\n }\n\n MyMessages = OnlineItems.map((item) => Tool.jsonify(item));\n MyMessages = _filterByVersion(MyMessages);\n MyMessages = _filterByVip(MyMessages);\n MyMessages = _filterByUser(MyMessages);\n if (customFilter) {\n MyMessages = customFilter(MyMessages);\n }\n\n MyMessages = _handleReadMessages(MyMessages);\n\n // 由于强制插入的未读消息更改了时间,因此需要重新排序\n MyMessages = MyMessages.sort((a: Message, b: Message) => {\n let dateA = new Date(a.updatedAt).getTime();\n let dateB = new Date(b.updatedAt).getTime();\n return dateB - dateA;\n });\n console.log('Message 处理完毕');\n isDataReady = true;\n MessageModel.emitChange();\n};\n\nexport type MessageFilter = (oldMessage: Message[]) => Message[];\n\nexport const MessageModel = {\n init: (customFilter?: MessageFilter) => {\n Notification.addListener('onVipRefresh', () => {\n // 监听多次,直到成功,整个生命周期最多处理一次\n if (!isVipStateReady) {\n isVipStateReady = true;\n _handleResponse(customFilter);\n }\n });\n\n ConfigDataModel.addListener(() => {\n if (!isConfigStateReady) {\n isConfigStateReady = true;\n _handleResponse(customFilter);\n }\n });\n\n Notification.addListener(\n 'onLogin',\n ({ isAuto, user, error }: LoginResultDataType) => {\n if (!isAuto && user && !error) {\n isDataReady = false;\n isConfigStateReady = false;\n isVipStateReady = false;\n isNetwordDataReady = false;\n OnlineItems = [];\n MessageModel.fetch(customFilter);\n }\n }\n );\n\n MessageModel.fetch(customFilter);\n },\n\n fetch: (customFilter?: MessageFilter) => {\n // 确保可重入,但如果网络一直出错的话,每次调用都会一直发\n if (isNetwordDataReady) {\n return;\n }\n\n const query = new AV.Query('Message');\n query\n .equalTo('valid', true)\n .equalTo(Platform.OS, true)\n .descending('updatedAt');\n query\n .find()\n .then(async (items: Object[]) => {\n console.log('Message 抓取完毕');\n isNetwordDataReady = true;\n OnlineItems = items;\n _handleResponse(customFilter);\n })\n .catch((e: any) => {\n console.error(e);\n });\n },\n\n getUnreadMessages: (): Message[] => {\n return MyMessages.filter((item) => !item.isRead);\n },\n\n getAllMessages: (): Message[] => {\n return MyMessages;\n },\n\n markMessageRead: async (message: Message) => {\n if (message.isRead || !message.objectId) {\n return;\n }\n message.isRead = true;\n\n if (message.key) {\n const freConfig: FreConfigType = {\n key: message.key,\n limit: message.limit,\n gap: message.gap,\n };\n // 能被展示出来的 message 一定是符合 FrequenceManager.canRun 的\n if (freConfig.gap) {\n FrequenceManager.markFinishForTime(freConfig);\n } else if (freConfig.limit) {\n FrequenceManager.markFinishForCount(freConfig);\n }\n }\n\n const readMsgs = PrefData.getValue(BuildInPrefs.Messages);\n readMsgs.push(message.objectId);\n await PrefData.setValue(BuildInPrefs.Messages, readMsgs);\n MessageModel.emitChange();\n },\n\n emitChange: () => {\n eventEmitter.emit('change', MyMessages.slice());\n },\n\n addListenerOnce: (callback: Function) => {\n if (isDataReady) {\n callback && callback();\n return;\n }\n eventEmitter.once('change', callback);\n },\n\n addListener: (callback: Function) => {\n if (isDataReady) {\n callback && callback();\n return callback;\n }\n eventEmitter.on('change', callback);\n return callback;\n },\n\n removeListener: (callback: Function) => {\n eventEmitter.removeListener('change', callback);\n },\n};\n"],"mappings":"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"}
|
@@ -0,0 +1,71 @@
|
|
1
|
+
import { getReadableVersion } from 'react-native-device-info';
|
2
|
+
import { DevConfig } from './DevConfig';
|
3
|
+
import { BuildInPrefs } from './PrefData';
|
4
|
+
const semverGt = require('semver/functions/gt');
|
5
|
+
const semverGte = require('semver/functions/gte');
|
6
|
+
const semverCoerce = require('semver/functions/coerce');
|
7
|
+
let VersionInfo = {
|
8
|
+
currentAppVersion: semverCoerce(getReadableVersion()).version,
|
9
|
+
currentBundleVersion: 1,
|
10
|
+
isDanger: false,
|
11
|
+
hasNewAppVersion: false,
|
12
|
+
hasNewBundleVersion: false
|
13
|
+
};
|
14
|
+
const VersionManager = {
|
15
|
+
init: _ref => {
|
16
|
+
let {
|
17
|
+
latestAppVersion,
|
18
|
+
latestBundleVersion
|
19
|
+
} = _ref;
|
20
|
+
if (latestAppVersion) {
|
21
|
+
const onlineVersion = semverCoerce(latestAppVersion).version;
|
22
|
+
// online > current,才有新版本
|
23
|
+
if (semverGt(onlineVersion, VersionInfo.currentAppVersion)) {
|
24
|
+
VersionInfo.hasNewAppVersion = true;
|
25
|
+
}
|
26
|
+
// current > online,就危险
|
27
|
+
if (semverGt(VersionInfo.currentAppVersion, onlineVersion)) {
|
28
|
+
VersionInfo.isDanger = true;
|
29
|
+
}
|
30
|
+
}
|
31
|
+
if (__DEV__ && DevConfig.hasValue(BuildInPrefs.DevDanger)) {
|
32
|
+
VersionInfo.isDanger = DevConfig.getValue(BuildInPrefs.DevDanger);
|
33
|
+
}
|
34
|
+
if (latestBundleVersion) {
|
35
|
+
const onlineVersion = semverCoerce(latestBundleVersion).version;
|
36
|
+
if (semverGt(onlineVersion, VersionInfo.currentBundleVersion)) {
|
37
|
+
VersionInfo.hasNewBundleVersion = true;
|
38
|
+
}
|
39
|
+
}
|
40
|
+
},
|
41
|
+
isDanger: () => {
|
42
|
+
return VersionInfo.isDanger;
|
43
|
+
},
|
44
|
+
appVer: () => {
|
45
|
+
return VersionInfo.currentAppVersion;
|
46
|
+
},
|
47
|
+
bundleVer: () => {
|
48
|
+
return VersionInfo.currentBundleVersion;
|
49
|
+
},
|
50
|
+
hasNewAppVer: () => {
|
51
|
+
return VersionInfo.hasNewAppVersion;
|
52
|
+
},
|
53
|
+
hasNewBundleVer: () => {
|
54
|
+
return VersionInfo.hasNewBundleVersion;
|
55
|
+
},
|
56
|
+
isValidVersion: (minVer, maxVer) => {
|
57
|
+
var _minVer, _maxVer;
|
58
|
+
minVer = (_minVer = minVer) === null || _minVer === void 0 ? void 0 : _minVer.trim();
|
59
|
+
maxVer = (_maxVer = maxVer) === null || _maxVer === void 0 ? void 0 : _maxVer.trim();
|
60
|
+
// 确保 cur 处于 [minVer, maxVer)
|
61
|
+
if (!!minVer && semverGt(semverCoerce(minVer).version, VersionManager.appVer())) {
|
62
|
+
return false;
|
63
|
+
}
|
64
|
+
if (!!maxVer && semverGte(VersionManager.appVer(), semverCoerce(maxVer).version)) {
|
65
|
+
return false;
|
66
|
+
}
|
67
|
+
return true;
|
68
|
+
}
|
69
|
+
};
|
70
|
+
export default VersionManager;
|
71
|
+
//# sourceMappingURL=VersionManager.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"names":["getReadableVersion","DevConfig","BuildInPrefs","semverGt","require","semverGte","semverCoerce","VersionInfo","currentAppVersion","version","currentBundleVersion","isDanger","hasNewAppVersion","hasNewBundleVersion","VersionManager","init","_ref","latestAppVersion","latestBundleVersion","onlineVersion","__DEV__","hasValue","DevDanger","getValue","appVer","bundleVer","hasNewAppVer","hasNewBundleVer","isValidVersion","minVer","maxVer","_minVer","_maxVer","trim"],"sources":["VersionManager.ts"],"sourcesContent":["import { getReadableVersion } from 'react-native-device-info';\nimport { DevConfig } from './DevConfig';\nimport { BuildInPrefs } from './PrefData';\n\nconst semverGt = require('semver/functions/gt');\nconst semverGte = require('semver/functions/gte');\nconst semverCoerce = require('semver/functions/coerce');\n\nlet VersionInfo = {\n currentAppVersion: semverCoerce(getReadableVersion()).version,\n currentBundleVersion: 1,\n isDanger: false,\n hasNewAppVersion: false,\n hasNewBundleVersion: false,\n};\n\nconst VersionManager = {\n init: ({\n latestAppVersion,\n latestBundleVersion,\n }: {\n latestAppVersion: string;\n latestBundleVersion?: string;\n }) => {\n if (latestAppVersion) {\n const onlineVersion = semverCoerce(latestAppVersion).version;\n // online > current,才有新版本\n if (semverGt(onlineVersion, VersionInfo.currentAppVersion)) {\n VersionInfo.hasNewAppVersion = true;\n }\n // current > online,就危险\n if (semverGt(VersionInfo.currentAppVersion, onlineVersion)) {\n VersionInfo.isDanger = true;\n }\n }\n\n if (__DEV__ && DevConfig.hasValue(BuildInPrefs.DevDanger)) {\n VersionInfo.isDanger = DevConfig.getValue(BuildInPrefs.DevDanger);\n }\n\n if (latestBundleVersion) {\n const onlineVersion = semverCoerce(latestBundleVersion).version;\n if (semverGt(onlineVersion, VersionInfo.currentBundleVersion)) {\n VersionInfo.hasNewBundleVersion = true;\n }\n }\n },\n\n isDanger: () => {\n return VersionInfo.isDanger;\n },\n\n appVer: () => {\n return VersionInfo.currentAppVersion;\n },\n\n bundleVer: () => {\n return VersionInfo.currentBundleVersion;\n },\n\n hasNewAppVer: () => {\n return VersionInfo.hasNewAppVersion;\n },\n\n hasNewBundleVer: () => {\n return VersionInfo.hasNewBundleVersion;\n },\n\n isValidVersion: (minVer?: string, maxVer?: string) => {\n minVer = minVer?.trim();\n maxVer = maxVer?.trim();\n // 确保 cur 处于 [minVer, maxVer)\n if (\n !!minVer &&\n semverGt(semverCoerce(minVer).version, VersionManager.appVer())\n ) {\n return false;\n }\n if (\n !!maxVer &&\n semverGte(VersionManager.appVer(), semverCoerce(maxVer).version)\n ) {\n return false;\n }\n return true;\n },\n};\nexport default VersionManager;\n"],"mappings":"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"}
|
@@ -4,12 +4,6 @@ export interface ConfigsType {
|
|
4
4
|
declare const ConfigDataModel: {
|
5
5
|
init: (defaultValues: ConfigsType) => void;
|
6
6
|
fetch: () => void;
|
7
|
-
getVersionConfig: () => {
|
8
|
-
currentVersion: any;
|
9
|
-
latestVersion: any;
|
10
|
-
isDanger: boolean;
|
11
|
-
hasNewVersion: boolean;
|
12
|
-
};
|
13
7
|
get: (key: string) => any;
|
14
8
|
emitChange: () => void;
|
15
9
|
addListenerOnce: (callback: Function) => void;
|
@@ -0,0 +1,13 @@
|
|
1
|
+
declare const VersionManager: {
|
2
|
+
init: ({ latestAppVersion, latestBundleVersion, }: {
|
3
|
+
latestAppVersion: string;
|
4
|
+
latestBundleVersion?: string | undefined;
|
5
|
+
}) => void;
|
6
|
+
isDanger: () => boolean;
|
7
|
+
appVer: () => any;
|
8
|
+
bundleVer: () => number;
|
9
|
+
hasNewAppVer: () => boolean;
|
10
|
+
hasNewBundleVer: () => boolean;
|
11
|
+
isValidVersion: (minVer?: string, maxVer?: string) => boolean;
|
12
|
+
};
|
13
|
+
export default VersionManager;
|
package/package.json
CHANGED
package/src/ConfigDataModel.ts
CHANGED
@@ -1,45 +1,28 @@
|
|
1
1
|
import { Object } from 'leancloud-storage';
|
2
2
|
import { Platform } from 'react-native';
|
3
|
-
import { getReadableVersion } from 'react-native-device-info';
|
4
|
-
import { DevConfig } from './DevConfig';
|
5
3
|
import { LoginManager, LoginResultDataType } from './LoginManager';
|
6
4
|
import { Notification } from './Notification';
|
7
|
-
import
|
5
|
+
import VersionManager from './VersionManager';
|
8
6
|
import { VipAndroidManager } from './VipAndroidManager';
|
9
7
|
|
10
8
|
const EventEmitter = require('events').EventEmitter;
|
11
9
|
const eventEmitter = new EventEmitter();
|
12
|
-
const semverGt = require('semver/functions/gt');
|
13
|
-
const semverGte = require('semver/functions/gte');
|
14
|
-
const semverCoerce = require('semver/functions/coerce');
|
15
10
|
|
16
11
|
export interface ConfigsType {
|
17
12
|
[key: string]: any;
|
18
13
|
}
|
19
14
|
let MyItems: ConfigsType = {};
|
20
|
-
let VersionInfo = {
|
21
|
-
currentVersion: semverCoerce(getReadableVersion()).version,
|
22
|
-
latestVersion: semverCoerce(getReadableVersion()).version,
|
23
|
-
isDanger: false,
|
24
|
-
hasNewVersion: false,
|
25
|
-
};
|
26
15
|
|
27
16
|
const AV = require('leancloud-storage');
|
28
17
|
|
29
18
|
const _filterByVersion = (items: Object[]) => {
|
30
19
|
let ret = [];
|
31
|
-
const curVer = semverCoerce(getReadableVersion()).version;
|
32
20
|
for (const item of items) {
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
if (!!minVer && semverGt(semverCoerce(minVer).version, curVer)) {
|
37
|
-
continue;
|
38
|
-
}
|
39
|
-
if (!!maxVer && semverGte(curVer, semverCoerce(maxVer).version)) {
|
21
|
+
if (
|
22
|
+
!VersionManager.isValidVersion(item.get('minVer'), item.get('maxVer'))
|
23
|
+
) {
|
40
24
|
continue;
|
41
25
|
}
|
42
|
-
|
43
26
|
ret.push(item);
|
44
27
|
}
|
45
28
|
return ret;
|
@@ -57,30 +40,12 @@ const _updateKeyValues = (items: Object[]) => {
|
|
57
40
|
};
|
58
41
|
|
59
42
|
const handleVersionInfo = () => {
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
if (configVersion) {
|
67
|
-
const onlineVersion = semverCoerce(configVersion).version;
|
68
|
-
// current < online,才有新版本
|
69
|
-
if (semverGt(onlineVersion, VersionInfo.currentVersion)) {
|
70
|
-
VersionInfo.latestVersion = onlineVersion;
|
71
|
-
VersionInfo.hasNewVersion = true;
|
72
|
-
}
|
73
|
-
// current <= online,才安全 ,防止忘记修改 online
|
74
|
-
if (semverGt(VersionInfo.currentVersion, onlineVersion)) {
|
75
|
-
VersionInfo.isDanger = true;
|
76
|
-
}
|
77
|
-
}
|
78
|
-
|
79
|
-
if (__DEV__) {
|
80
|
-
if (DevConfig.hasValue(BuildInPrefs.DevDanger)) {
|
81
|
-
VersionInfo.isDanger = DevConfig.getValue(BuildInPrefs.DevDanger);
|
82
|
-
}
|
83
|
-
}
|
43
|
+
VersionManager.init({
|
44
|
+
latestAppVersion: ConfigDataModel.get(
|
45
|
+
Platform.OS === 'android' ? 'aov' : 'ov'
|
46
|
+
),
|
47
|
+
latestBundleVersion: ConfigDataModel.get('bov'),
|
48
|
+
});
|
84
49
|
};
|
85
50
|
|
86
51
|
let isDataReady = false;
|
@@ -141,10 +106,6 @@ const ConfigDataModel = {
|
|
141
106
|
});
|
142
107
|
},
|
143
108
|
|
144
|
-
getVersionConfig: () => {
|
145
|
-
return VersionInfo;
|
146
|
-
},
|
147
|
-
|
148
109
|
get: (key: string) => {
|
149
110
|
return MyItems[key];
|
150
111
|
},
|
package/src/MessageModel.ts
CHANGED
@@ -7,6 +7,7 @@ import { LoginManager, LoginResultDataType } from './LoginManager';
|
|
7
7
|
import { Notification } from './Notification';
|
8
8
|
import { BuildInPrefs, PrefData } from './PrefData';
|
9
9
|
import { Tool } from './Tool';
|
10
|
+
import VersionManager from './VersionManager';
|
10
11
|
import { VipManager } from './VipManager';
|
11
12
|
|
12
13
|
const AV = require('leancloud-storage');
|
@@ -114,8 +115,10 @@ const _handleReadMessages = (items: Message[]): Message[] => {
|
|
114
115
|
if (item.key === 'changeLog') {
|
115
116
|
// 强制升级弹窗
|
116
117
|
// Message 是在 Config 回包之后再请求的,因此此时 Config 的值一定是准确的
|
117
|
-
|
118
|
-
|
118
|
+
if (
|
119
|
+
ConfigDataModel.get('upgrade_alert') &&
|
120
|
+
VersionManager.hasNewAppVer()
|
121
|
+
) {
|
119
122
|
item.isRead = false;
|
120
123
|
item.updatedAt = new Date().toString();
|
121
124
|
}
|
@@ -145,15 +148,21 @@ const _handleReadMessages = (items: Message[]): Message[] => {
|
|
145
148
|
|
146
149
|
let isDataReady = false;
|
147
150
|
let isConfigStateReady = false;
|
151
|
+
let isVipStateReady = false;
|
148
152
|
let isNetwordDataReady = false;
|
149
153
|
let OnlineItems: Object[] = [];
|
150
154
|
|
151
155
|
const _handleResponse = (customFilter?: MessageFilter) => {
|
152
|
-
if (
|
156
|
+
if (
|
157
|
+
!isConfigStateReady ||
|
158
|
+
!OnlineItems.length ||
|
159
|
+
!isNetwordDataReady ||
|
160
|
+
!isVipStateReady
|
161
|
+
) {
|
153
162
|
return;
|
154
163
|
}
|
155
164
|
|
156
|
-
if (
|
165
|
+
if (VersionManager.isDanger()) {
|
157
166
|
return;
|
158
167
|
}
|
159
168
|
|
@@ -182,7 +191,14 @@ export type MessageFilter = (oldMessage: Message[]) => Message[];
|
|
182
191
|
|
183
192
|
export const MessageModel = {
|
184
193
|
init: (customFilter?: MessageFilter) => {
|
185
|
-
|
194
|
+
Notification.addListener('onVipRefresh', () => {
|
195
|
+
// 监听多次,直到成功,整个生命周期最多处理一次
|
196
|
+
if (!isVipStateReady) {
|
197
|
+
isVipStateReady = true;
|
198
|
+
_handleResponse(customFilter);
|
199
|
+
}
|
200
|
+
});
|
201
|
+
|
186
202
|
ConfigDataModel.addListener(() => {
|
187
203
|
if (!isConfigStateReady) {
|
188
204
|
isConfigStateReady = true;
|
@@ -196,6 +212,7 @@ export const MessageModel = {
|
|
196
212
|
if (!isAuto && user && !error) {
|
197
213
|
isDataReady = false;
|
198
214
|
isConfigStateReady = false;
|
215
|
+
isVipStateReady = false;
|
199
216
|
isNetwordDataReady = false;
|
200
217
|
OnlineItems = [];
|
201
218
|
MessageModel.fetch(customFilter);
|
@@ -0,0 +1,88 @@
|
|
1
|
+
import { getReadableVersion } from 'react-native-device-info';
|
2
|
+
import { DevConfig } from './DevConfig';
|
3
|
+
import { BuildInPrefs } from './PrefData';
|
4
|
+
|
5
|
+
const semverGt = require('semver/functions/gt');
|
6
|
+
const semverGte = require('semver/functions/gte');
|
7
|
+
const semverCoerce = require('semver/functions/coerce');
|
8
|
+
|
9
|
+
let VersionInfo = {
|
10
|
+
currentAppVersion: semverCoerce(getReadableVersion()).version,
|
11
|
+
currentBundleVersion: 1,
|
12
|
+
isDanger: false,
|
13
|
+
hasNewAppVersion: false,
|
14
|
+
hasNewBundleVersion: false,
|
15
|
+
};
|
16
|
+
|
17
|
+
const VersionManager = {
|
18
|
+
init: ({
|
19
|
+
latestAppVersion,
|
20
|
+
latestBundleVersion,
|
21
|
+
}: {
|
22
|
+
latestAppVersion: string;
|
23
|
+
latestBundleVersion?: string;
|
24
|
+
}) => {
|
25
|
+
if (latestAppVersion) {
|
26
|
+
const onlineVersion = semverCoerce(latestAppVersion).version;
|
27
|
+
// online > current,才有新版本
|
28
|
+
if (semverGt(onlineVersion, VersionInfo.currentAppVersion)) {
|
29
|
+
VersionInfo.hasNewAppVersion = true;
|
30
|
+
}
|
31
|
+
// current > online,就危险
|
32
|
+
if (semverGt(VersionInfo.currentAppVersion, onlineVersion)) {
|
33
|
+
VersionInfo.isDanger = true;
|
34
|
+
}
|
35
|
+
}
|
36
|
+
|
37
|
+
if (__DEV__ && DevConfig.hasValue(BuildInPrefs.DevDanger)) {
|
38
|
+
VersionInfo.isDanger = DevConfig.getValue(BuildInPrefs.DevDanger);
|
39
|
+
}
|
40
|
+
|
41
|
+
if (latestBundleVersion) {
|
42
|
+
const onlineVersion = semverCoerce(latestBundleVersion).version;
|
43
|
+
if (semverGt(onlineVersion, VersionInfo.currentBundleVersion)) {
|
44
|
+
VersionInfo.hasNewBundleVersion = true;
|
45
|
+
}
|
46
|
+
}
|
47
|
+
},
|
48
|
+
|
49
|
+
isDanger: () => {
|
50
|
+
return VersionInfo.isDanger;
|
51
|
+
},
|
52
|
+
|
53
|
+
appVer: () => {
|
54
|
+
return VersionInfo.currentAppVersion;
|
55
|
+
},
|
56
|
+
|
57
|
+
bundleVer: () => {
|
58
|
+
return VersionInfo.currentBundleVersion;
|
59
|
+
},
|
60
|
+
|
61
|
+
hasNewAppVer: () => {
|
62
|
+
return VersionInfo.hasNewAppVersion;
|
63
|
+
},
|
64
|
+
|
65
|
+
hasNewBundleVer: () => {
|
66
|
+
return VersionInfo.hasNewBundleVersion;
|
67
|
+
},
|
68
|
+
|
69
|
+
isValidVersion: (minVer?: string, maxVer?: string) => {
|
70
|
+
minVer = minVer?.trim();
|
71
|
+
maxVer = maxVer?.trim();
|
72
|
+
// 确保 cur 处于 [minVer, maxVer)
|
73
|
+
if (
|
74
|
+
!!minVer &&
|
75
|
+
semverGt(semverCoerce(minVer).version, VersionManager.appVer())
|
76
|
+
) {
|
77
|
+
return false;
|
78
|
+
}
|
79
|
+
if (
|
80
|
+
!!maxVer &&
|
81
|
+
semverGte(VersionManager.appVer(), semverCoerce(maxVer).version)
|
82
|
+
) {
|
83
|
+
return false;
|
84
|
+
}
|
85
|
+
return true;
|
86
|
+
},
|
87
|
+
};
|
88
|
+
export default VersionManager;
|