@x-edu/live-player 0.0.19 → 0.0.21
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/.browserslistrc +10 -10
- package/.eslintignore +8 -8
- package/.eslintrc.js +26 -26
- package/.gem-mine +11 -11
- package/.postcssrc.js +6 -6
- package/README.md +145 -145
- package/babel.config.js +33 -33
- package/dist/XEduLivePlayer.common.js +12161 -1154
- package/dist/XEduLivePlayerPre.common.js +12369 -1358
- package/doc/develop.md +23 -23
- package/gem-mine.config.js +86 -86
- package/jest.config.js +9 -9
- package/jsconfig.json +15 -15
- package/mock/helper.js +8 -8
- package/mock/index.js +34 -34
- package/package.json +99 -99
- package/public/3rd/ali-player/alipayercomponents-1.0.8.min.js +26 -26
- package/public/3rd/ali-player/aliplayer-hls-min.js +27 -27
- package/public/3rd/ali-player/aliplayer-min.js +1 -1
- package/public/3rd/im-web-push/index.umd.js +14 -14
- package/public/JsBridge.js +1602 -1602
- package/public/fish/editor/themes/default/css/ueditor.css +1905 -1905
- package/public/fish/editor/third-party/codemirror/codemirror.css +104 -104
- package/public/fish/editor/third-party/codemirror/codemirror.js +3581 -3581
- package/public/fish/editor/third-party/zeroclipboard/ZeroClipboard.js +1255 -1255
- package/public/fish/editor/ueditor.all.min.js +16 -16
- package/public/fish/editor/ueditor.config.js +467 -467
- package/public/fish/icon/umd-4.1.2.js +1 -1
- package/public/fish/video/videoplayer.min.css +6 -6
- package/public/fish/video/videoplayer.min.js +31 -31
- package/public/fish/video/zh-CN.js +82 -82
- package/public/icon/demo.css +539 -539
- package/public/icon/demo_index.html +2189 -2189
- package/public/icon/iconfont.css +363 -363
- package/public/icon/iconfont.json +618 -618
- package/public/index.html +50 -50
- package/script/image/readme.md +77 -77
- package/script/postcss.js +48 -48
- package/src/App.jsx +24 -24
- package/src/asset/img/course/playing.svg +21 -21
- package/src/asset/img/icon-course-white.svg +3 -3
- package/src/asset/img/icon-course.svg +3 -3
- package/src/asset/img/icon-eye-white.svg +4 -4
- package/src/asset/img/icon-eye.svg +4 -4
- package/src/asset/img/icon-school-white.svg +3 -3
- package/src/asset/img/icon-school.svg +3 -3
- package/src/asset/img/loading.svg +52 -52
- package/src/asset/img/video-play.svg +6 -6
- package/src/asset/style/background.less +19 -19
- package/src/asset/style/banner.less +36 -36
- package/src/asset/style/base.less +74 -74
- package/src/asset/style/index.less +114 -114
- package/src/asset/style/reset-theme.less +141 -141
- package/src/asset/style/theme/index.less +55 -55
- package/src/asset/style/theme/party/global.less +20 -20
- package/src/asset/style/theme/party/override.less +57 -57
- package/src/asset/style/theme/test/global.less +18 -18
- package/src/asset/style/theme/test/override.less +45 -45
- package/src/asset/style/variable.less +12 -12
- package/src/component/AliPlayer/index.jsx +49 -49
- package/src/component/Avatar/index.jsx +50 -50
- package/src/component/Empty/index.jsx +34 -34
- package/src/component/Empty/index.module.less +37 -37
- package/src/component/IMChatroom/component/status/403.jsx +13 -13
- package/src/component/IMChatroom/component/status/404.jsx +13 -13
- package/src/component/IMChatroom/component/status/Error.jsx +23 -23
- package/src/component/IMChatroom/component/status/Loading.jsx +5 -5
- package/src/component/IMChatroom/config/app/config.js +118 -118
- package/src/component/IMChatroom/config/app/index.js +60 -60
- package/src/component/IMChatroom/config/env.js +5 -5
- package/src/component/IMChatroom/config/index.js +3 -3
- package/src/component/IMChatroom/config/request/config/base.js +124 -124
- package/src/component/IMChatroom/config/request/config/chatroom.js +26 -26
- package/src/component/IMChatroom/config/request/config/imCoreApi.js +21 -21
- package/src/component/IMChatroom/config/request/index.js +21 -21
- package/src/component/IMChatroom/config/request/proxy.js +39 -39
- package/src/component/IMChatroom/config/url.js +7 -7
- package/src/component/IMChatroom/constants/errorCode.js +9 -9
- package/src/component/IMChatroom/constants/index.js +84 -84
- package/src/component/IMChatroom/constants/origin.js +27 -27
- package/src/component/IMChatroom/context/chatroom.js +154 -154
- package/src/component/IMChatroom/context/connect.js +28 -28
- package/src/component/IMChatroom/i18n/en/index.json +73 -73
- package/src/component/IMChatroom/i18n/index.jsx +14 -14
- package/src/component/IMChatroom/i18n/language.js +9 -9
- package/src/component/IMChatroom/i18n/zh-CN/index.json +73 -73
- package/src/component/IMChatroom/index.jsx +49 -49
- package/src/component/IMChatroom/page/chat/index.jsx +27 -27
- package/src/component/IMChatroom/page/chat/messageEditor/index.jsx +375 -375
- package/src/component/IMChatroom/page/chat/messageList/index.jsx +354 -354
- package/src/component/IMChatroom/page/chat/stickedMessage/index.jsx +59 -59
- package/src/component/IMChatroom/page/chat/stickedMessage/style/index.module.less +7 -7
- package/src/component/IMChatroom/page/chat/style/index.module.less +51 -51
- package/src/component/IMChatroom/page/home/connect/index.jsx +188 -188
- package/src/component/IMChatroom/page/home/connect/status.jsx +124 -124
- package/src/component/IMChatroom/page/home/context/cmd.jsx +37 -37
- package/src/component/IMChatroom/page/home/context/index.jsx +67 -67
- package/src/component/IMChatroom/page/home/index.jsx +164 -164
- package/src/component/IMChatroom/page/home/notice/index.jsx +123 -123
- package/src/component/IMChatroom/page/home/notice/style/index.module.less +49 -49
- package/src/component/IMChatroom/page/home/style/index.module.less +110 -110
- package/src/component/IMChatroom/page/member/index.jsx +15 -15
- package/src/component/IMChatroom/page/member/memberCount/index.jsx +44 -44
- package/src/component/IMChatroom/page/member/memberList/index.jsx +121 -121
- package/src/component/IMChatroom/page/member/style/index.module.less +2 -2
- package/src/component/IMChatroom/sdk/bridge.js +39 -39
- package/src/component/IMChatroom/sdk/cs/constants.js +20 -20
- package/src/component/IMChatroom/sdk/cs/index.js +101 -101
- package/src/component/IMChatroom/sdk/imChatroom.js +15 -15
- package/src/component/IMChatroom/sdk/imcore/constants.js +128 -128
- package/src/component/IMChatroom/sdk/imcore/emitters/chatroomDestroyed.js +5 -5
- package/src/component/IMChatroom/sdk/imcore/emitters/chatroomInfoGetFail.js +5 -5
- package/src/component/IMChatroom/sdk/imcore/emitters/chatroomKickedByAdmin.js +5 -5
- package/src/component/IMChatroom/sdk/imcore/emitters/chatroomKickedBySelf.js +5 -5
- package/src/component/IMChatroom/sdk/imcore/emitters/chatroomLoginFail.js +5 -5
- package/src/component/IMChatroom/sdk/imcore/emitters/chatroomLoginSuccess.js +5 -5
- package/src/component/IMChatroom/sdk/imcore/emitters/chatroomMemberLogin.js +5 -5
- package/src/component/IMChatroom/sdk/imcore/emitters/chatroomMemberLogout.js +5 -5
- package/src/component/IMChatroom/sdk/imcore/emitters/connectionConnected.js +5 -5
- package/src/component/IMChatroom/sdk/imcore/emitters/connectionConnecting.js +5 -5
- package/src/component/IMChatroom/sdk/imcore/emitters/connectionDisconnect.js +5 -5
- package/src/component/IMChatroom/sdk/imcore/emitters/index.js +57 -57
- package/src/component/IMChatroom/sdk/imcore/emitters/messageReceive.js +36 -36
- package/src/component/IMChatroom/sdk/imcore/index.js +178 -178
- package/src/component/IMChatroom/sdk/imcore/interceptors/request.js +7 -7
- package/src/component/IMChatroom/sdk/imcore/interceptors/response.js +5 -5
- package/src/component/IMChatroom/sdk/imcore/plugins/getAuth.js +64 -64
- package/src/component/IMChatroom/sdk/imcore/plugins/getConversationId.js +20 -20
- package/src/component/IMChatroom/sdk/imcore/plugins/getExtInfo.js +10 -10
- package/src/component/IMChatroom/sdk/imcore/plugins/getLoginInfo.js +48 -48
- package/src/component/IMChatroom/sdk/imcore/plugins/getPlatformType.js +12 -12
- package/src/component/IMChatroom/sdk/imcore/plugins/index.js +22 -22
- package/src/component/IMChatroom/sdk/imcore/util/format.js +177 -177
- package/src/component/IMChatroom/sdk/imcore/util/parser.js +35 -35
- package/src/component/IMChatroom/sdk/oms.js +18 -18
- package/src/component/IMChatroom/sdk/uc.js +3 -3
- package/src/component/IMChatroom/subscription/channel/app.js +5 -5
- package/src/component/IMChatroom/subscription/channel/ctl.js +22 -22
- package/src/component/IMChatroom/subscription/channel/member.js +40 -40
- package/src/component/IMChatroom/subscription/channel/message.js +13 -13
- package/src/component/IMChatroom/subscription/channel/ntf.js +86 -86
- package/src/component/IMChatroom/subscription/channel/tel.js +5 -5
- package/src/component/IMChatroom/subscription/channel/websocket.js +5 -5
- package/src/component/IMChatroom/subscription/event.js +37 -37
- package/src/component/IMChatroom/subscription/index.js +19 -19
- package/src/component/IMChatroom/util/account.js +8 -8
- package/src/component/IMChatroom/util/chatroom.js +255 -255
- package/src/component/IMChatroom/util/jsonBigInt.js +5 -5
- package/src/component/IMChatroom/util/location.js +12 -12
- package/src/component/Icon/index.jsx +16 -16
- package/src/component/Icon/index.module.less +2 -2
- package/src/component/Pagination/LocalPagination.jsx +27 -27
- package/src/component/Pagination/RemotePagination.jsx +32 -32
- package/src/component/Pagination/index.jsx +31 -31
- package/src/component/Pagination/index.module.less +110 -110
- package/src/component/PlayerTip/index.jsx +34 -34
- package/src/component/VideoBase/index.jsx +242 -242
- package/src/component/VideoBase/style.less +65 -65
- package/src/component/VideoBase/utils.js +81 -81
- package/src/component/mixin.less +9 -9
- package/src/component/status/403.jsx +15 -15
- package/src/component/status/404/index.jsx +73 -73
- package/src/component/status/404/index.module.less +36 -36
- package/src/component/status/Error/error.module.less +13 -13
- package/src/component/status/Error/index.jsx +47 -47
- package/src/component/status/Loading/img/loading.svg +52 -52
- package/src/component/status/Loading/index.jsx +31 -31
- package/src/component/status/Loading/index.less +56 -56
- package/src/component/status/None/index.jsx +20 -20
- package/src/component/status/None/index.module.less +35 -35
- package/src/component/status/Status/index.jsx +26 -26
- package/src/component/status/Status/index.module.less +8 -8
- package/src/config/constant/commonUrl.js +2 -2
- package/src/config/constant/user.js +6 -6
- package/src/config/context/site-config.js +48 -48
- package/src/config/env/index.js +5 -5
- package/src/config/env/local/index.js +13 -13
- package/src/config/env/ncet-xedu/api.js +175 -175
- package/src/config/env/ncet-xedu/app.js +12 -12
- package/src/config/env/ncet-xedu/cs.js +8 -8
- package/src/config/env/ncet-xedu/index.js +14 -14
- package/src/config/env/ncet-xedu/push.js +5 -5
- package/src/config/env/preproduction/api.js +144 -144
- package/src/config/env/preproduction/app.js +12 -12
- package/src/config/env/preproduction/cs.js +8 -8
- package/src/config/env/preproduction/index.js +14 -14
- package/src/config/env/preproduction/push.js +5 -5
- package/src/config/env/product/api.js +113 -113
- package/src/config/env/product/app.js +12 -12
- package/src/config/env/product/cs.js +5 -5
- package/src/config/env/product/index.js +14 -14
- package/src/config/env/product/push.js +5 -5
- package/src/config/live.js +80 -80
- package/src/config/publicLive.js +53 -53
- package/src/config/request/assessments.js +24 -24
- package/src/config/request/config-center.js +8 -8
- package/src/config/request/helper.js +166 -166
- package/src/config/request/im-broadcasts.js +12 -12
- package/src/config/request/live-activity-gateway.js +8 -8
- package/src/config/request/live-activity.js +13 -13
- package/src/config/request/raw.js +6 -6
- package/src/config/request/x-cloud-web.js +13 -13
- package/src/config/request/x-proxy.js +34 -34
- package/src/demo/Detail.jsx +11 -11
- package/src/demo/List.jsx +64 -64
- package/src/demo/index.jsx +17 -17
- package/src/detail/LineSwitch/index.jsx +71 -71
- package/src/detail/LiveCountDown/index.jsx +44 -44
- package/src/detail/LiveCountDown/index.module.less +31 -31
- package/src/detail/LiveOnlineCount/img/icon.svg +15 -15
- package/src/detail/LiveOnlineCount/index.jsx +68 -68
- package/src/detail/LiveOnlineCount/index.module.less +34 -34
- package/src/detail/LiveOnlineCount/util.js +74 -74
- package/src/detail/LiveStatus/AnchorOnTheWay.jsx +88 -88
- package/src/detail/LiveStatus/index.jsx +202 -202
- package/src/detail/LiveStatus/index.module.less +192 -192
- package/src/detail/LiveVideo/config.js +37 -37
- package/src/detail/LiveVideo/index.jsx +188 -188
- package/src/detail/LiveVideo/index.module.less +41 -41
- package/src/detail/NotLoginChatroom/index.jsx +37 -37
- package/src/detail/NotLoginChatroom/index.module.less +46 -46
- package/src/detail/RecordVideo/index.jsx +150 -150
- package/src/detail/RecordVideo/index.module.less +31 -31
- package/src/detail/ReplayVideo/index.jsx +93 -93
- package/src/detail/ReplayVideo/index.module.less +65 -65
- package/src/detail/const.js +20 -20
- package/src/detail/hook/usePullSource.js +82 -82
- package/src/detail/hook/usePullState.js +51 -51
- package/src/detail/index.jsx +482 -482
- package/src/detail/index.module.less +188 -188
- package/src/hook/useAsync.js +84 -84
- package/src/hook/useGoToPage.js +83 -83
- package/src/hook/useInterval.js +28 -28
- package/src/hook/useIsMounted.js +17 -17
- package/src/hook/useModuleByRole.js +53 -53
- package/src/hook/usePageScrollable.js +52 -52
- package/src/hook/usePortal.js +83 -83
- package/src/hook/useScrollRestore/index.js +32 -32
- package/src/hook/useScrollRestore/scrollContext.js +20 -20
- package/src/hook/useTrackRef.js +11 -11
- package/src/hook/useWindowSize.js +28 -28
- package/src/hook/useZoom.js +47 -47
- package/src/index.js +10 -10
- package/src/lib/getLiveOnlineCount.js +10 -10
- package/src/lib/getServiceConfig.js +102 -102
- package/src/list/Empty/index.jsx +20 -20
- package/src/list/Empty/index.module.less +23 -23
- package/src/list/ListItem/Action/index.jsx +98 -98
- package/src/list/ListItem/Action/index.module.less +21 -21
- package/src/list/ListItem/img/dianzan.svg +4 -0
- package/src/list/ListItem/img/play.svg +15 -15
- package/src/list/ListItem/img/yiguankan.svg +3 -0
- package/src/list/ListItem/index.jsx +24 -1
- package/src/list/ListItem/index.module.less +146 -123
- package/src/list/index.jsx +80 -0
- package/src/list/index.module.less +35 -35
- package/src/service/common.js +73 -73
- package/src/service/content-mgr.js +73 -73
- package/src/service/im-group.js +12 -12
- package/src/service/im.js +7 -7
- package/src/service/imBroadcasts.js +33 -33
- package/src/service/like.js +134 -134
- package/src/service/manageApi.js +7 -7
- package/src/service/managePortal.js +6 -6
- package/src/service/myStudyRecord.js +93 -93
- package/src/service/navigation.js +47 -47
- package/src/service/ndMeeting.js +10 -10
- package/src/service/ndr.js +122 -122
- package/src/service/news.js +93 -93
- package/src/service/personalCenter.js +270 -270
- package/src/service/qualityCourse.js +31 -31
- package/src/service/recommend.js +81 -81
- package/src/service/school.js +323 -323
- package/src/service/search.js +170 -170
- package/src/service/site-config.js +7 -7
- package/src/service/socialCensor.js +45 -45
- package/src/service/specialEdu.js +31 -31
- package/src/service/suggestion.js +85 -85
- package/src/service/syncClassroom.js +321 -321
- package/src/service/tCourse.js +204 -204
- package/src/service/tchTraining.js +37 -37
- package/src/service/uc.js +45 -45
- package/src/util/app.js +1 -1
- package/src/util/array.js +3 -3
- package/src/util/auth/func.js +57 -57
- package/src/util/date.js +53 -53
- package/src/util/env.js +9 -9
- package/src/util/getTimestamp.js +10 -10
- package/src/util/hof.js +105 -105
- package/src/util/live/index.js +42 -42
- package/src/util/liveCountUtil.js +52 -0
- package/src/util/netUrl.js +35 -35
- package/src/util/object.js +13 -13
- package/src/util/push/index.js +58 -58
- package/src/util/request.js +227 -227
- package/src/util/type.js +17 -17
- package/src/util/url.js +203 -203
- package/src/util/video.js +26 -26
- package/test/setup.js +21 -21
- package/test/unit/component/header/logo.spec.jsx +8 -8
- package/test/unit/helper.jsx +25 -25
- package/test/unit/util/date.spec.js +40 -40
package/src/util/url.js
CHANGED
|
@@ -1,203 +1,203 @@
|
|
|
1
|
-
import queryString from 'query-string'
|
|
2
|
-
import { isInElectron } from './env'
|
|
3
|
-
// import config from '@/config/env'
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* 获取 url query 参数
|
|
7
|
-
* 在 hash 模式下,如果 query 在 hash 后面 location.query 拿不到值
|
|
8
|
-
* 因此通过 location.href 来获取
|
|
9
|
-
*/
|
|
10
|
-
export function getUrlQuery(url) {
|
|
11
|
-
const query = (url ?? window.location.href).split('?')
|
|
12
|
-
if (query.length > 1) {
|
|
13
|
-
let params = {}
|
|
14
|
-
query.slice(1).forEach((item) => {
|
|
15
|
-
let parseString = item
|
|
16
|
-
if (item.indexOf('#') > -1) {
|
|
17
|
-
parseString = item.split(/\/?#/)[0]
|
|
18
|
-
}
|
|
19
|
-
params = {
|
|
20
|
-
...queryString.parse(parseString),
|
|
21
|
-
...params
|
|
22
|
-
}
|
|
23
|
-
})
|
|
24
|
-
return params
|
|
25
|
-
}
|
|
26
|
-
return {}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export function pathJoin(...args) {
|
|
30
|
-
return args.join('/').replace(/\/{2,}/g, '/')
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export function queryJoin(url, query) {
|
|
34
|
-
return `${url}${url.indexOf('?') === -1 ? '?' : '&'}${queryString.stringify(query)}`
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export function getPageName(pathname) {
|
|
38
|
-
const map = {
|
|
39
|
-
'/': '首页',
|
|
40
|
-
'/syncClassroom': '课程教学',
|
|
41
|
-
'/syncClassroom/textBook/:courseId': '课本',
|
|
42
|
-
'/syncClassroom/classActivity': '课时活动',
|
|
43
|
-
'/sedu': '德育',
|
|
44
|
-
'/content/detail': '内容详情',
|
|
45
|
-
'/sedu/:id/catalog': '栏目页',
|
|
46
|
-
'/schoolService': '课后服务',
|
|
47
|
-
'/schoolService/:id/catalog': '栏目页',
|
|
48
|
-
'/family': '家庭教育',
|
|
49
|
-
'/family/:id/catalog': '栏目页',
|
|
50
|
-
'/teacherTrainingNav': '教师研修',
|
|
51
|
-
'/teacherTraining': '教师研修',
|
|
52
|
-
'/teacherTraining/courseDetail': '教师研修',
|
|
53
|
-
'/lecturer': '讲师',
|
|
54
|
-
'/eduReform': '教改经验',
|
|
55
|
-
'/eduReform/catalog': '栏目页'
|
|
56
|
-
}
|
|
57
|
-
const matchKey = Object.keys(map).find((key) => {
|
|
58
|
-
const route = key.split('/')
|
|
59
|
-
const cur = pathname.split('/')
|
|
60
|
-
let flag = true
|
|
61
|
-
if (route.length !== cur.length) {
|
|
62
|
-
return false
|
|
63
|
-
}
|
|
64
|
-
for (let i = 0; i < route.length; i++) {
|
|
65
|
-
if (route[i].indexOf(':') !== 0 && route[i] !== cur[i]) {
|
|
66
|
-
flag = false
|
|
67
|
-
break
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
return flag
|
|
71
|
-
})
|
|
72
|
-
return matchKey ? map[matchKey] : ''
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
export function getValueByHost({ value, defaultValue }) {
|
|
76
|
-
const host = window.location.host.split(':')[0]
|
|
77
|
-
const pretest = [
|
|
78
|
-
'localhost',
|
|
79
|
-
// TODO:下一行等正式提交时删除,便于本地调试
|
|
80
|
-
'127.0.0.1',
|
|
81
|
-
'web-bd.ykt.eduyun.cn',
|
|
82
|
-
'xue-test.ykt.eduyun.cn',
|
|
83
|
-
'test3.ykt.eduyun.cn',
|
|
84
|
-
'test5.ykt.eduyun.cn',
|
|
85
|
-
'test6.ykt.eduyun.cn'
|
|
86
|
-
]
|
|
87
|
-
if (pretest.indexOf(host) > -1) {
|
|
88
|
-
return value
|
|
89
|
-
}
|
|
90
|
-
return defaultValue
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
export function isTest() {
|
|
94
|
-
return (
|
|
95
|
-
window.location.href.indexOf('ykt.eduyun.cn') > -1
|
|
96
|
-
|| window.location.href.indexOf('ndaeweb.com') > -1
|
|
97
|
-
|| window.location.href.indexOf('101.com') > -1
|
|
98
|
-
|| window.location.href.indexOf('localhost') > -1
|
|
99
|
-
|| window.location.href.indexOf('127.0.0.1') > -1
|
|
100
|
-
)
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// home 路径是被第三方嵌入的页面,所有点击跳转到智教云登录
|
|
104
|
-
export function getLink(url = '') {
|
|
105
|
-
const inHome = window.location.pathname === '/home'
|
|
106
|
-
if (inHome) {
|
|
107
|
-
const clientId = 'O9b107EvSr98frNb48oI98KVr4Q17NrR'
|
|
108
|
-
let redirectUri
|
|
109
|
-
if (url.indexOf('http') === 0) {
|
|
110
|
-
redirectUri = url
|
|
111
|
-
} else {
|
|
112
|
-
redirectUri = `https://${window.location.host}${url}`
|
|
113
|
-
}
|
|
114
|
-
const state = btoa(redirectUri)
|
|
115
|
-
const uri = `https://auth.smartedu.cn/uias/app/view?client_id=${clientId}&state=${state}`
|
|
116
|
-
return uri
|
|
117
|
-
} else {
|
|
118
|
-
return url
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
// 异步用window.open打开,会有安全性弹窗,可使用setTimeout
|
|
122
|
-
export function asyncWindowOpen(url) {
|
|
123
|
-
if (navigator.userAgent.indexOf('Firefox') > -1) {
|
|
124
|
-
setTimeout(() => {
|
|
125
|
-
window.open(url)
|
|
126
|
-
}, 0)
|
|
127
|
-
} else {
|
|
128
|
-
window.open(url)
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* 在electron 中的 url 跳转, 用自带的默认浏览器打开
|
|
134
|
-
* @param {string} url
|
|
135
|
-
* @param {string} target
|
|
136
|
-
*/
|
|
137
|
-
export function urlJumpInElectron(url, target = '_blank') {
|
|
138
|
-
if (!url) {
|
|
139
|
-
return
|
|
140
|
-
}
|
|
141
|
-
if (isInElectron) {
|
|
142
|
-
// electron环境下用自带浏览器打开
|
|
143
|
-
window.open(url, target, 'forceExternal')
|
|
144
|
-
} else {
|
|
145
|
-
window.open(url, target)
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
export function removeQueryFromUrl(paramKey) {
|
|
150
|
-
const url = window.location.href
|
|
151
|
-
const r = new URL(url)
|
|
152
|
-
r.searchParams.delete(paramKey)
|
|
153
|
-
const newUrl = r.href
|
|
154
|
-
window.history.replaceState({
|
|
155
|
-
path: newUrl
|
|
156
|
-
}, '', newUrl)
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
export function getPathnamePrefix(deep = 1) {
|
|
160
|
-
const pathnames = window.location.pathname.split('/')
|
|
161
|
-
const prefix = ['', pathnames[1] || 'area']
|
|
162
|
-
|
|
163
|
-
for (let _deep = 2; _deep <= deep; _deep++) {
|
|
164
|
-
if (_deep === 2) {
|
|
165
|
-
// todo: 这个地址有错
|
|
166
|
-
// eslint-disable-next-line no-undef
|
|
167
|
-
prefix.push(pathnames[2] || (isMicro ? 'micro' : 'site'))
|
|
168
|
-
} else {
|
|
169
|
-
prefix.push(pathnames[_deep] || '')
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
return prefix.join('/')
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
export function removeQueryInUrl(keys) {
|
|
177
|
-
const url = new URL(window.location.href)
|
|
178
|
-
keys.forEach((key) => {
|
|
179
|
-
url.searchParams.delete(key)
|
|
180
|
-
})
|
|
181
|
-
const urlStr = url.toString()
|
|
182
|
-
window.history.replaceState({}, '', urlStr)
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
export function getSdpQuery() {
|
|
186
|
-
const query = getUrlQuery()
|
|
187
|
-
const sdpOrgId = query.__org_id || query['sdp-org-id'] || ''
|
|
188
|
-
const sdpAppId = query['sdp-app-id']
|
|
189
|
-
return {
|
|
190
|
-
sdpOrgId,
|
|
191
|
-
sdpAppId
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
export function getNDRTestQuery() {
|
|
196
|
-
if (getUrlQuery()?._test_course_) {
|
|
197
|
-
window.localStorage.setItem('_test_course_', '1')
|
|
198
|
-
return true
|
|
199
|
-
}
|
|
200
|
-
if (window.localStorage.getItem('_test_course_')) {
|
|
201
|
-
return true
|
|
202
|
-
}
|
|
203
|
-
}
|
|
1
|
+
import queryString from 'query-string'
|
|
2
|
+
import { isInElectron } from './env'
|
|
3
|
+
// import config from '@/config/env'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 获取 url query 参数
|
|
7
|
+
* 在 hash 模式下,如果 query 在 hash 后面 location.query 拿不到值
|
|
8
|
+
* 因此通过 location.href 来获取
|
|
9
|
+
*/
|
|
10
|
+
export function getUrlQuery(url) {
|
|
11
|
+
const query = (url ?? window.location.href).split('?')
|
|
12
|
+
if (query.length > 1) {
|
|
13
|
+
let params = {}
|
|
14
|
+
query.slice(1).forEach((item) => {
|
|
15
|
+
let parseString = item
|
|
16
|
+
if (item.indexOf('#') > -1) {
|
|
17
|
+
parseString = item.split(/\/?#/)[0]
|
|
18
|
+
}
|
|
19
|
+
params = {
|
|
20
|
+
...queryString.parse(parseString),
|
|
21
|
+
...params
|
|
22
|
+
}
|
|
23
|
+
})
|
|
24
|
+
return params
|
|
25
|
+
}
|
|
26
|
+
return {}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function pathJoin(...args) {
|
|
30
|
+
return args.join('/').replace(/\/{2,}/g, '/')
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function queryJoin(url, query) {
|
|
34
|
+
return `${url}${url.indexOf('?') === -1 ? '?' : '&'}${queryString.stringify(query)}`
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function getPageName(pathname) {
|
|
38
|
+
const map = {
|
|
39
|
+
'/': '首页',
|
|
40
|
+
'/syncClassroom': '课程教学',
|
|
41
|
+
'/syncClassroom/textBook/:courseId': '课本',
|
|
42
|
+
'/syncClassroom/classActivity': '课时活动',
|
|
43
|
+
'/sedu': '德育',
|
|
44
|
+
'/content/detail': '内容详情',
|
|
45
|
+
'/sedu/:id/catalog': '栏目页',
|
|
46
|
+
'/schoolService': '课后服务',
|
|
47
|
+
'/schoolService/:id/catalog': '栏目页',
|
|
48
|
+
'/family': '家庭教育',
|
|
49
|
+
'/family/:id/catalog': '栏目页',
|
|
50
|
+
'/teacherTrainingNav': '教师研修',
|
|
51
|
+
'/teacherTraining': '教师研修',
|
|
52
|
+
'/teacherTraining/courseDetail': '教师研修',
|
|
53
|
+
'/lecturer': '讲师',
|
|
54
|
+
'/eduReform': '教改经验',
|
|
55
|
+
'/eduReform/catalog': '栏目页'
|
|
56
|
+
}
|
|
57
|
+
const matchKey = Object.keys(map).find((key) => {
|
|
58
|
+
const route = key.split('/')
|
|
59
|
+
const cur = pathname.split('/')
|
|
60
|
+
let flag = true
|
|
61
|
+
if (route.length !== cur.length) {
|
|
62
|
+
return false
|
|
63
|
+
}
|
|
64
|
+
for (let i = 0; i < route.length; i++) {
|
|
65
|
+
if (route[i].indexOf(':') !== 0 && route[i] !== cur[i]) {
|
|
66
|
+
flag = false
|
|
67
|
+
break
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return flag
|
|
71
|
+
})
|
|
72
|
+
return matchKey ? map[matchKey] : ''
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function getValueByHost({ value, defaultValue }) {
|
|
76
|
+
const host = window.location.host.split(':')[0]
|
|
77
|
+
const pretest = [
|
|
78
|
+
'localhost',
|
|
79
|
+
// TODO:下一行等正式提交时删除,便于本地调试
|
|
80
|
+
'127.0.0.1',
|
|
81
|
+
'web-bd.ykt.eduyun.cn',
|
|
82
|
+
'xue-test.ykt.eduyun.cn',
|
|
83
|
+
'test3.ykt.eduyun.cn',
|
|
84
|
+
'test5.ykt.eduyun.cn',
|
|
85
|
+
'test6.ykt.eduyun.cn'
|
|
86
|
+
]
|
|
87
|
+
if (pretest.indexOf(host) > -1) {
|
|
88
|
+
return value
|
|
89
|
+
}
|
|
90
|
+
return defaultValue
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export function isTest() {
|
|
94
|
+
return (
|
|
95
|
+
window.location.href.indexOf('ykt.eduyun.cn') > -1
|
|
96
|
+
|| window.location.href.indexOf('ndaeweb.com') > -1
|
|
97
|
+
|| window.location.href.indexOf('101.com') > -1
|
|
98
|
+
|| window.location.href.indexOf('localhost') > -1
|
|
99
|
+
|| window.location.href.indexOf('127.0.0.1') > -1
|
|
100
|
+
)
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// home 路径是被第三方嵌入的页面,所有点击跳转到智教云登录
|
|
104
|
+
export function getLink(url = '') {
|
|
105
|
+
const inHome = window.location.pathname === '/home'
|
|
106
|
+
if (inHome) {
|
|
107
|
+
const clientId = 'O9b107EvSr98frNb48oI98KVr4Q17NrR'
|
|
108
|
+
let redirectUri
|
|
109
|
+
if (url.indexOf('http') === 0) {
|
|
110
|
+
redirectUri = url
|
|
111
|
+
} else {
|
|
112
|
+
redirectUri = `https://${window.location.host}${url}`
|
|
113
|
+
}
|
|
114
|
+
const state = btoa(redirectUri)
|
|
115
|
+
const uri = `https://auth.smartedu.cn/uias/app/view?client_id=${clientId}&state=${state}`
|
|
116
|
+
return uri
|
|
117
|
+
} else {
|
|
118
|
+
return url
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// 异步用window.open打开,会有安全性弹窗,可使用setTimeout
|
|
122
|
+
export function asyncWindowOpen(url) {
|
|
123
|
+
if (navigator.userAgent.indexOf('Firefox') > -1) {
|
|
124
|
+
setTimeout(() => {
|
|
125
|
+
window.open(url)
|
|
126
|
+
}, 0)
|
|
127
|
+
} else {
|
|
128
|
+
window.open(url)
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* 在electron 中的 url 跳转, 用自带的默认浏览器打开
|
|
134
|
+
* @param {string} url
|
|
135
|
+
* @param {string} target
|
|
136
|
+
*/
|
|
137
|
+
export function urlJumpInElectron(url, target = '_blank') {
|
|
138
|
+
if (!url) {
|
|
139
|
+
return
|
|
140
|
+
}
|
|
141
|
+
if (isInElectron) {
|
|
142
|
+
// electron环境下用自带浏览器打开
|
|
143
|
+
window.open(url, target, 'forceExternal')
|
|
144
|
+
} else {
|
|
145
|
+
window.open(url, target)
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export function removeQueryFromUrl(paramKey) {
|
|
150
|
+
const url = window.location.href
|
|
151
|
+
const r = new URL(url)
|
|
152
|
+
r.searchParams.delete(paramKey)
|
|
153
|
+
const newUrl = r.href
|
|
154
|
+
window.history.replaceState({
|
|
155
|
+
path: newUrl
|
|
156
|
+
}, '', newUrl)
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export function getPathnamePrefix(deep = 1) {
|
|
160
|
+
const pathnames = window.location.pathname.split('/')
|
|
161
|
+
const prefix = ['', pathnames[1] || 'area']
|
|
162
|
+
|
|
163
|
+
for (let _deep = 2; _deep <= deep; _deep++) {
|
|
164
|
+
if (_deep === 2) {
|
|
165
|
+
// todo: 这个地址有错
|
|
166
|
+
// eslint-disable-next-line no-undef
|
|
167
|
+
prefix.push(pathnames[2] || (isMicro ? 'micro' : 'site'))
|
|
168
|
+
} else {
|
|
169
|
+
prefix.push(pathnames[_deep] || '')
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
return prefix.join('/')
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
export function removeQueryInUrl(keys) {
|
|
177
|
+
const url = new URL(window.location.href)
|
|
178
|
+
keys.forEach((key) => {
|
|
179
|
+
url.searchParams.delete(key)
|
|
180
|
+
})
|
|
181
|
+
const urlStr = url.toString()
|
|
182
|
+
window.history.replaceState({}, '', urlStr)
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
export function getSdpQuery() {
|
|
186
|
+
const query = getUrlQuery()
|
|
187
|
+
const sdpOrgId = query.__org_id || query['sdp-org-id'] || ''
|
|
188
|
+
const sdpAppId = query['sdp-app-id']
|
|
189
|
+
return {
|
|
190
|
+
sdpOrgId,
|
|
191
|
+
sdpAppId
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
export function getNDRTestQuery() {
|
|
196
|
+
if (getUrlQuery()?._test_course_) {
|
|
197
|
+
window.localStorage.setItem('_test_course_', '1')
|
|
198
|
+
return true
|
|
199
|
+
}
|
|
200
|
+
if (window.localStorage.getItem('_test_course_')) {
|
|
201
|
+
return true
|
|
202
|
+
}
|
|
203
|
+
}
|
package/src/util/video.js
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
import { isIE, isWin7 } from './type'
|
|
2
|
-
|
|
3
|
-
// 获取类型
|
|
4
|
-
export const getType = (type) => {
|
|
5
|
-
if (['mp3', 'wav', 'ogg'].includes(type)) {
|
|
6
|
-
return `audio/${type}`
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
if (type === 'm3u8') {
|
|
10
|
-
return 'application/x-mpegURL'
|
|
11
|
-
}
|
|
12
|
-
return `video/${type}`
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
// 获取资源 url 的类型
|
|
16
|
-
export const getUrlType = (url) => {
|
|
17
|
-
const video = (/.*\.(mp4|mp3|wav|webm|ogg|m3u8)/i).exec(url)
|
|
18
|
-
let type = ''
|
|
19
|
-
if (video?.[1]) {
|
|
20
|
-
type = video[1].toLowerCase()
|
|
21
|
-
}
|
|
22
|
-
return type
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// win7-ie11下播放m3u8,提示用户视频无法播放
|
|
26
|
-
export const showPlayerTip = (url) => isIE() && isWin7() && getUrlType(url) === 'm3u8'
|
|
1
|
+
import { isIE, isWin7 } from './type'
|
|
2
|
+
|
|
3
|
+
// 获取类型
|
|
4
|
+
export const getType = (type) => {
|
|
5
|
+
if (['mp3', 'wav', 'ogg'].includes(type)) {
|
|
6
|
+
return `audio/${type}`
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
if (type === 'm3u8') {
|
|
10
|
+
return 'application/x-mpegURL'
|
|
11
|
+
}
|
|
12
|
+
return `video/${type}`
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// 获取资源 url 的类型
|
|
16
|
+
export const getUrlType = (url) => {
|
|
17
|
+
const video = (/.*\.(mp4|mp3|wav|webm|ogg|m3u8)/i).exec(url)
|
|
18
|
+
let type = ''
|
|
19
|
+
if (video?.[1]) {
|
|
20
|
+
type = video[1].toLowerCase()
|
|
21
|
+
}
|
|
22
|
+
return type
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// win7-ie11下播放m3u8,提示用户视频无法播放
|
|
26
|
+
export const showPlayerTip = (url) => isIE() && isWin7() && getUrlType(url) === 'm3u8'
|
package/test/setup.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
const { Crypto } = require('@peculiar/webcrypto')
|
|
2
|
-
const { TextEncoder } = require('util')
|
|
3
|
-
|
|
4
|
-
global.crypto = new Crypto()
|
|
5
|
-
global.TextEncoder = TextEncoder
|
|
6
|
-
|
|
7
|
-
// uc sdk 会报 console.warn
|
|
8
|
-
jest.spyOn(global.console, 'warn').mockImplementation(() => jest.fn())
|
|
9
|
-
|
|
10
|
-
expect.extend({
|
|
11
|
-
toBeType(received, argument) {
|
|
12
|
-
const type = Array.isArray(received) ? 'array' : typeof received
|
|
13
|
-
return type === argument ? {
|
|
14
|
-
message: () => `expected ${received} to be type ${argument}`,
|
|
15
|
-
pass: true
|
|
16
|
-
} : {
|
|
17
|
-
message: () => `expected ${received} to be type ${argument}`,
|
|
18
|
-
pass: false
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
})
|
|
1
|
+
const { Crypto } = require('@peculiar/webcrypto')
|
|
2
|
+
const { TextEncoder } = require('util')
|
|
3
|
+
|
|
4
|
+
global.crypto = new Crypto()
|
|
5
|
+
global.TextEncoder = TextEncoder
|
|
6
|
+
|
|
7
|
+
// uc sdk 会报 console.warn
|
|
8
|
+
jest.spyOn(global.console, 'warn').mockImplementation(() => jest.fn())
|
|
9
|
+
|
|
10
|
+
expect.extend({
|
|
11
|
+
toBeType(received, argument) {
|
|
12
|
+
const type = Array.isArray(received) ? 'array' : typeof received
|
|
13
|
+
return type === argument ? {
|
|
14
|
+
message: () => `expected ${received} to be type ${argument}`,
|
|
15
|
+
pass: true
|
|
16
|
+
} : {
|
|
17
|
+
message: () => `expected ${received} to be type ${argument}`,
|
|
18
|
+
pass: false
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
})
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import { renderWithRouter } from '../../helper'
|
|
3
|
-
import Logo from '@/component/Header/Logo'
|
|
4
|
-
|
|
5
|
-
test('component - header - logo', () => {
|
|
6
|
-
const { container } = renderWithRouter(<Logo />)
|
|
7
|
-
expect(container.querySelector('#logo')).toBeInTheDocument()
|
|
8
|
-
})
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { renderWithRouter } from '../../helper'
|
|
3
|
+
import Logo from '@/component/Header/Logo'
|
|
4
|
+
|
|
5
|
+
test('component - header - logo', () => {
|
|
6
|
+
const { container } = renderWithRouter(<Logo />)
|
|
7
|
+
expect(container.querySelector('#logo')).toBeInTheDocument()
|
|
8
|
+
})
|
package/test/unit/helper.jsx
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
import { createMemoryHistory } from 'history'
|
|
2
|
-
import React from 'react'
|
|
3
|
-
import { Router } from 'react-router-dom'
|
|
4
|
-
import { render } from '@testing-library/react'
|
|
5
|
-
|
|
6
|
-
export function renderWithRouter(
|
|
7
|
-
ui,
|
|
8
|
-
{ route = '/',
|
|
9
|
-
x,
|
|
10
|
-
history = createMemoryHistory({
|
|
11
|
-
initialEntries: [x ?? route]
|
|
12
|
-
}),
|
|
13
|
-
...renderOptions } = {}
|
|
14
|
-
) {
|
|
15
|
-
function Wrapper({ children }) {
|
|
16
|
-
return <Router history={history}>{children}</Router>
|
|
17
|
-
}
|
|
18
|
-
return {
|
|
19
|
-
...render(ui, {
|
|
20
|
-
wrapper: Wrapper,
|
|
21
|
-
...renderOptions
|
|
22
|
-
}),
|
|
23
|
-
history
|
|
24
|
-
}
|
|
25
|
-
}
|
|
1
|
+
import { createMemoryHistory } from 'history'
|
|
2
|
+
import React from 'react'
|
|
3
|
+
import { Router } from 'react-router-dom'
|
|
4
|
+
import { render } from '@testing-library/react'
|
|
5
|
+
|
|
6
|
+
export function renderWithRouter(
|
|
7
|
+
ui,
|
|
8
|
+
{ route = '/',
|
|
9
|
+
x,
|
|
10
|
+
history = createMemoryHistory({
|
|
11
|
+
initialEntries: [x ?? route]
|
|
12
|
+
}),
|
|
13
|
+
...renderOptions } = {}
|
|
14
|
+
) {
|
|
15
|
+
function Wrapper({ children }) {
|
|
16
|
+
return <Router history={history}>{children}</Router>
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
...render(ui, {
|
|
20
|
+
wrapper: Wrapper,
|
|
21
|
+
...renderOptions
|
|
22
|
+
}),
|
|
23
|
+
history
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -1,40 +1,40 @@
|
|
|
1
|
-
import { formatTimeDisplay, formatSeconds } from '@/util/date'
|
|
2
|
-
|
|
3
|
-
const dayInWeekTexts = ['周天', '周一', '周二', '周三', '周四', '周五', '周六']
|
|
4
|
-
const padZore = (str, len = 2) => str.toString().padStart(len, 0)
|
|
5
|
-
|
|
6
|
-
describe('test formatTimeDisplay', () => {
|
|
7
|
-
test('today test', () => {
|
|
8
|
-
const today = new Date()
|
|
9
|
-
const todayStr = formatTimeDisplay(today.getTime())
|
|
10
|
-
expect(todayStr).toBe(`今天 ${dayInWeekTexts[today.getDay()]}`)
|
|
11
|
-
})
|
|
12
|
-
|
|
13
|
-
test('same year test', () => {
|
|
14
|
-
const yesterday = new Date(Date.now() - 24 * 60 * 60 * 1000)
|
|
15
|
-
const yesterdayStr = formatTimeDisplay(yesterday.getTime())
|
|
16
|
-
const tomorrow = new Date(Date.now() + 24 * 60 * 60 * 1000)
|
|
17
|
-
const tomorrowStr = formatTimeDisplay(tomorrow.getTime())
|
|
18
|
-
const isUseTomorrow = tomorrow.getFullYear() === new Date().getFullYear()
|
|
19
|
-
|
|
20
|
-
const str = isUseTomorrow ? tomorrowStr : yesterdayStr
|
|
21
|
-
const date = isUseTomorrow ? tomorrow : yesterday
|
|
22
|
-
expect(str).toBe(`${padZore(date.getMonth() + 1)}月${padZore(date.getDate())}日 ${dayInWeekTexts[date.getDay()]}`)
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
test('different year test', () => {
|
|
26
|
-
const date = new Date('2020-12-01')
|
|
27
|
-
const dateStr = formatTimeDisplay(date)
|
|
28
|
-
expect(dateStr).toBe(`${date.getFullYear()}年${padZore(date.getMonth() + 1)}月${padZore(date.getDate())}日 ${dayInWeekTexts[date.getDay()]}`)
|
|
29
|
-
})
|
|
30
|
-
})
|
|
31
|
-
|
|
32
|
-
test('formatSeconds', async () => {
|
|
33
|
-
const seconds = formatSeconds(12)
|
|
34
|
-
const minutes = formatSeconds(88)
|
|
35
|
-
const hours = formatSeconds(3600 + 60 + 5)
|
|
36
|
-
|
|
37
|
-
expect(seconds).toBe('00:12')
|
|
38
|
-
expect(minutes).toBe('01:28')
|
|
39
|
-
expect(hours).toBe('01:01:05')
|
|
40
|
-
})
|
|
1
|
+
import { formatTimeDisplay, formatSeconds } from '@/util/date'
|
|
2
|
+
|
|
3
|
+
const dayInWeekTexts = ['周天', '周一', '周二', '周三', '周四', '周五', '周六']
|
|
4
|
+
const padZore = (str, len = 2) => str.toString().padStart(len, 0)
|
|
5
|
+
|
|
6
|
+
describe('test formatTimeDisplay', () => {
|
|
7
|
+
test('today test', () => {
|
|
8
|
+
const today = new Date()
|
|
9
|
+
const todayStr = formatTimeDisplay(today.getTime())
|
|
10
|
+
expect(todayStr).toBe(`今天 ${dayInWeekTexts[today.getDay()]}`)
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
test('same year test', () => {
|
|
14
|
+
const yesterday = new Date(Date.now() - 24 * 60 * 60 * 1000)
|
|
15
|
+
const yesterdayStr = formatTimeDisplay(yesterday.getTime())
|
|
16
|
+
const tomorrow = new Date(Date.now() + 24 * 60 * 60 * 1000)
|
|
17
|
+
const tomorrowStr = formatTimeDisplay(tomorrow.getTime())
|
|
18
|
+
const isUseTomorrow = tomorrow.getFullYear() === new Date().getFullYear()
|
|
19
|
+
|
|
20
|
+
const str = isUseTomorrow ? tomorrowStr : yesterdayStr
|
|
21
|
+
const date = isUseTomorrow ? tomorrow : yesterday
|
|
22
|
+
expect(str).toBe(`${padZore(date.getMonth() + 1)}月${padZore(date.getDate())}日 ${dayInWeekTexts[date.getDay()]}`)
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
test('different year test', () => {
|
|
26
|
+
const date = new Date('2020-12-01')
|
|
27
|
+
const dateStr = formatTimeDisplay(date)
|
|
28
|
+
expect(dateStr).toBe(`${date.getFullYear()}年${padZore(date.getMonth() + 1)}月${padZore(date.getDate())}日 ${dayInWeekTexts[date.getDay()]}`)
|
|
29
|
+
})
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
test('formatSeconds', async () => {
|
|
33
|
+
const seconds = formatSeconds(12)
|
|
34
|
+
const minutes = formatSeconds(88)
|
|
35
|
+
const hours = formatSeconds(3600 + 60 + 5)
|
|
36
|
+
|
|
37
|
+
expect(seconds).toBe('00:12')
|
|
38
|
+
expect(minutes).toBe('01:28')
|
|
39
|
+
expect(hours).toBe('01:01:05')
|
|
40
|
+
})
|