Initial commit

This commit is contained in:
2026-06-05 17:46:51 +08:00
commit c04c890186
96 changed files with 6477 additions and 0 deletions

92
miniprogram/app.ts Normal file
View File

@@ -0,0 +1,92 @@
import { UserProfile, GeoPoint } from './types/index'
import { getCachedUser, login } from './utils/auth'
import { CLOUD_ENV, HEARTBEAT_INTERVAL_MS } from './utils/constants'
import { api } from './utils/api'
App<{
userInfo: UserProfile | null
isLoggedIn: boolean
currentLocation: GeoPoint | null
_locationTimer: number | null
}>({
globalData: {
userInfo: null,
isLoggedIn: false,
currentLocation: null,
_locationTimer: null,
},
onLaunch() {
wx.cloud.init({
env: CLOUD_ENV,
traceUser: true,
})
const cached = getCachedUser()
if (cached) {
this.globalData.userInfo = cached
this.globalData.isLoggedIn = true
}
this._initLocation()
},
onShow() {
this._startLocationHeartbeat()
},
onHide() {
this._stopLocationHeartbeat()
},
async _initLogin() {
try {
const userInfo = await login()
this.globalData.userInfo = userInfo
this.globalData.isLoggedIn = true
} catch (e) {
console.error('Login failed', e)
}
},
_initLocation() {
wx.getLocation({
type: 'gcj02',
success: res => {
this.globalData.currentLocation = {
latitude: res.latitude,
longitude: res.longitude,
}
if (this.globalData.isLoggedIn) {
api.updateLocation(res.latitude, res.longitude).catch(() => {})
}
},
fail: () => {},
})
},
_startLocationHeartbeat() {
if (this.globalData._locationTimer) return
this.globalData._locationTimer = setInterval(() => {
if (!this.globalData.isLoggedIn) return
wx.getLocation({
type: 'gcj02',
success: res => {
this.globalData.currentLocation = {
latitude: res.latitude,
longitude: res.longitude,
}
api.updateLocation(res.latitude, res.longitude).catch(() => {})
},
fail: () => {},
})
}, HEARTBEAT_INTERVAL_MS)
},
_stopLocationHeartbeat() {
if (this.globalData._locationTimer) {
clearInterval(this.globalData._locationTimer)
this.globalData._locationTimer = null
}
},
})