This commit is contained in:
Xu Chang 2022-09-14 19:50:30 +08:00
commit e2e8efe5a5
7 changed files with 247 additions and 33 deletions

View File

@ -9,5 +9,8 @@ export declare class Location<ED extends EntityDict, Cxt extends Context<ED>, AD
latitude: number;
longitude: number;
}>;
refresh(): void;
refresh(): Promise<{
latitude: number;
longitude: number;
}>;
}

View File

@ -11,11 +11,12 @@ var Location = /** @class */ (function (_super) {
Location.prototype.get = function (acceptableLatency) {
if (acceptableLatency === void 0) { acceptableLatency = 10000; }
return tslib_1.__awaiter(this, void 0, void 0, function () {
var result;
var result, getGeolocation, result;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
if (this.lastTimestamp && Date.now() - this.lastTimestamp < acceptableLatency) {
if (this.lastTimestamp &&
Date.now() - this.lastTimestamp < acceptableLatency) {
return [2 /*return*/, {
latitude: this.latitude,
longitude: this.longitude,
@ -23,7 +24,7 @@ var Location = /** @class */ (function (_super) {
}
if (!(process.env.OAK_PLATFORM === 'wechatMp')) return [3 /*break*/, 2];
return [4 /*yield*/, wx.getLocation({
type: 'gcj02'
type: 'gcj02',
})];
case 1:
result = _a.sent();
@ -34,13 +35,68 @@ var Location = /** @class */ (function (_super) {
latitude: this.latitude,
longitude: this.longitude,
}];
case 2: throw new Error('Method not implemented.');
case 2:
getGeolocation = function () {
return new Promise(function (resolve, reject) {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function (position) {
// 1. coords.latitude估计纬度
// 2. coords.longitude估计经度
// 3. coords.altitude估计高度
// 4. coords.accuracy所提供的以米为单位的经度和纬度估计的精确度
// 5. coords.altitudeAccuracy所提供的以米为单位的高度估计的精确度
// 6. coords.heading 宿主设备当前移动的角度方向,相对于正北方向顺时针计算
// 7. coords.speed以米每秒为单位的设备的当前对地速度
var coords = position.coords;
var location = {
accuracy: coords.accuracy,
altitude: coords.altitude,
altitudeAccuracy: coords.altitudeAccuracy,
heading: coords.heading,
latitude: coords.latitude,
longitude: coords.longitude,
speed: coords.speed,
};
resolve(location);
}, function (error) {
reject(error);
}, {
// 指示浏览器获取高精度的位置默认为false
enableHighAccuracy: true,
// 指定获取地理位置的超时时间,默认不限时,单位为毫秒
timeout: 10000,
// 最长有效期,在重复获取地理位置时,此参数指定多久再次获取位置。
maximumAge: 3000,
});
}
else {
reject('Your browser does not support Geolocation!');
}
});
};
return [4 /*yield*/, getGeolocation()];
case 3:
result = (_a.sent());
this.lastTimestamp = Date.now();
this.latitude = result.latitude;
this.longitude = result.longitude;
return [2 /*return*/, {
latitude: this.latitude,
longitude: this.longitude,
}];
}
});
});
};
Location.prototype.refresh = function () {
throw new Error('Method not implemented.');
return tslib_1.__awaiter(this, void 0, void 0, function () {
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.get()];
case 1: return [2 /*return*/, _a.sent()];
}
});
});
};
tslib_1.__decorate([
Feature_1.Action

View File

@ -28,12 +28,12 @@ var withRouter = function (Component, isComponent, path) {
var navigate = (0, react_router_dom_1.useNavigate)();
var _a = (0, react_i18next_1.useTranslation)(), t = _a.t, i18n = _a.i18n;
var width = (0, responsive_1.useWidth)();
var forwardedRef = props.forwardedRef, rest = tslib_1.__rest(props, ["forwardedRef"]);
var location = (0, react_router_dom_1.useLocation)();
if (isComponent || !location.pathname.includes(path)) {
return ((0, jsx_runtime_1.jsx)(Component, tslib_1.__assign({}, rest, { t: t, i18n: i18n, width: width, navigate: navigate, ref: forwardedRef })));
var forwardedRef = props.forwardedRef, rest = tslib_1.__rest(props, ["forwardedRef"]);
var params = {};
if (!isComponent && location.pathname.includes(path)) {
params = getParams(location);
}
var params = getParams(location);
return ((0, jsx_runtime_1.jsx)(Component, tslib_1.__assign({}, rest, params, { t: t, i18n: i18n, width: width, navigate: navigate, location: location, ref: forwardedRef })));
};
return react_1.default.forwardRef(function (props, ref) { return (0, jsx_runtime_1.jsx)(ComponentWithRouterProp, tslib_1.__assign({}, props, { forwardedRef: ref })); });

View File

@ -0,0 +1,110 @@
var Interpreter = (function (r) {
var o = '';
function i(r, n) {
return r
? 'string' == typeof r
? r
: r
.reduce(function (r, t) {
return r.concat([
(function (n, e) {
if (((e = e || {}), 'string' == typeof n))
return n;
{
var r, t, u;
if (n[2] && 'object' == typeof n[2])
return (
(r = Object.keys(n[2]).reduce(
function (r, t) {
return (
(r[t] = i(
n[2][t],
e
)),
r
);
},
{}
)),
(t = r[e[0]]),
void 0 !== (u = e[n[0]])
? r[u.toString()] ||
r.other ||
o
: t || r.other || o
);
}
if ('object' == typeof n && 0 < n.length)
return (function r(t, n, e) {
void 0 === e && (e = 0);
if (!n || !t || t.length <= 0)
return '';
n = n[t[e]];
if ('string' == typeof n) return n;
if ('number' == typeof n)
return n.toString();
if (!n)
return '{'.concat(
t.join('.'),
'}'
);
return r(t, n, ++e);
})(n[0].split('.'), e, 0);
return '';
})(t, n),
]);
}, [])
.join('')
: o;
}
function c(r, t, n) {
return (
('object' == typeof r &&
((t = t).constructor && 'Array' === t.constructor
? t
: t
.replace(getRegExp('\[', 'ig'), '.')
.replace(getRegExp('\]', 'ig'), '')
.split('.')
).reduce(function (r, t) {
return (r || {})[t];
}, r)) ||
n
);
}
function f(r) {
var t = r;
return (t =
r && -1 !== r.indexOf(':')
? r.replace(getRegExp(':', 'ig'), '.')
: t);
}
function g(r, t, n) {
var e = f(n),
r = r[t];
return (r && (r[e] || c(r, e))) || n;
}
return (
(r.getMessageInterpreter = function () {
function u(r, t, n, e) {
return i(
(function (r, t, n, e) {
var u = f(r);
if (!(n = t[n])) return g(t, e, r);
var o = n[u];
return (o = o || c(n, u)) ? o : g(t, e, r);
})(r, e, n, n),
t
);
}
return function (r, t, n, e) {
return 3 === arguments.length
? u(r, null, t, n)
: 4 === arguments.length
? u(r, t, n, e)
: '';
};
}),
r
);
})({});

View File

@ -61,7 +61,7 @@
},
"scripts": {
"clean": "rimraf lib/*",
"copy-files": "copyfiles -u 1 src/**/*.css lib/",
"copy-files": "copyfiles -u 1 src/**/*.css src/**/wxs.js lib/",
"build": "tsc && npm run copy-files",
"test": "ts-node ./test/test.ts",
"prepare": "rimraf node_modules/react & rimraf node_modules/react-dom & rimraf node_modules/react-router"

View File

@ -2,12 +2,19 @@ import { EntityDict, Aspect, Context } from 'oak-domain/lib/types';
import { Action, Feature } from '../types/Feature';
import { CommonAspectDict } from 'oak-common-aspect';
export class Location<ED extends EntityDict, Cxt extends Context<ED>, AD extends CommonAspectDict<ED, Cxt>> extends Feature<ED, Cxt, AD> {
export class Location<
ED extends EntityDict,
Cxt extends Context<ED>,
AD extends CommonAspectDict<ED, Cxt>
> extends Feature<ED, Cxt, AD> {
private latitude?: number;
private longitude?: number;
private lastTimestamp?: number;
async get(acceptableLatency: number = 10000) {
if (this.lastTimestamp && Date.now() - this.lastTimestamp < acceptableLatency) {
if (
this.lastTimestamp &&
Date.now() - this.lastTimestamp < acceptableLatency
) {
return {
latitude: this.latitude!,
longitude: this.longitude!,
@ -16,7 +23,7 @@ export class Location<ED extends EntityDict, Cxt extends Context<ED>, AD extends
if (process.env.OAK_PLATFORM === 'wechatMp') {
// 小程序平台
const result = await wx.getLocation({
type: 'gcj02'
type: 'gcj02',
});
this.latitude = result.latitude;
this.longitude = result.longitude;
@ -26,14 +33,61 @@ export class Location<ED extends EntityDict, Cxt extends Context<ED>, AD extends
latitude: this.latitude!,
longitude: this.longitude!,
};
}
else {
throw new Error('Method not implemented.');
} else {
const getGeolocation = () =>
new Promise((resolve, reject) => {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(
(position) => {
// 1. coords.latitude估计纬度
// 2. coords.longitude估计经度
// 3. coords.altitude估计高度
// 4. coords.accuracy所提供的以米为单位的经度和纬度估计的精确度
// 5. coords.altitudeAccuracy所提供的以米为单位的高度估计的精确度
// 6. coords.heading 宿主设备当前移动的角度方向,相对于正北方向顺时针计算
// 7. coords.speed以米每秒为单位的设备的当前对地速度
const coords = position.coords;
const location = {
accuracy: coords.accuracy,
altitude: coords.altitude,
altitudeAccuracy: coords.altitudeAccuracy,
heading: coords.heading,
latitude: coords.latitude,
longitude: coords.longitude,
speed: coords.speed,
};
resolve(location);
},
(error) => {
reject(error);
},
{
// 指示浏览器获取高精度的位置默认为false
enableHighAccuracy: true,
// 指定获取地理位置的超时时间,默认不限时,单位为毫秒
timeout: 10000,
// 最长有效期,在重复获取地理位置时,此参数指定多久再次获取位置。
maximumAge: 3000,
}
);
} else {
reject('Your browser does not support Geolocation!');
}
});
const result = (await getGeolocation()) as GeolocationCoordinates;
this.lastTimestamp = Date.now();
this.latitude = result.latitude!;
this.longitude = result.longitude!;
return {
latitude: this.latitude!,
longitude: this.longitude!,
};
}
}
@Action
refresh() {
throw new Error('Method not implemented.');
}
async refresh() {
return await this.get();
}
}

View File

@ -32,22 +32,13 @@ const withRouter = (Component: React.ComponentType<any>, isComponent?: boolean,
const navigate = useNavigate();
const { t, i18n } = useTranslation();
const width = useWidth();
const { forwardedRef, ...rest } = props;
const location = useLocation();
const { forwardedRef, ...rest } = props;
if (isComponent || !location.pathname.includes(path)) {
return (
<Component
{...rest}
t={t}
i18n={i18n}
width={width}
navigate={navigate}
ref={forwardedRef}
/>
);
let params = {};
if (!isComponent && location.pathname.includes(path)) {
params = getParams(location as Location);
}
const params = getParams(location as Location);
return (
<Component