UNPKG

coolink-ts

Version:

Coocaa Coolink APP JavaScript library base on Thresh-lib.

471 lines (437 loc) 14.4 kB
/** * MIT License * * Copyright (c) 2020 ManBang Group * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * */ import Widget, { BasicWidget } from './Widget' import VNode from './VNode' import appContainer from './AppContainer' import ChildrenRule from './ChildrenRule' import MethodChannel, { FlutterMethodChannelType } from '../channel/MethodChannel' import Util from '../shared/Util' import { PageProps, AppBarProps, ContainerProps, StackViewProps, ScrollViewProps, ListViewProps, NestScrollViewProps, DrawerScrollViewProps, DragableScrollViewProps, SwipeActionsViewProps, NativeViewProps, SwiperViewProps, TextProps, IconProps, ImageProps, QrImageProps, SpinProps, RefreshProps, NoticeBarProps, ButtonProps, RadioProps, CheckboxProps, InputProps, SwitchProps, PickerProps, TabViewProps, GridViewProps, SpinningWheelProps, TurntableProps, VideoViewProps, AudioViewProps, PdfViewProps, } from '../types/widget' const AnimationDuration = 150 /** * 页面布局 */ // 页面组件 export class Page extends BasicWidget<PageProps, any> { static async invokeBeforePagePop(): Promise<boolean> { const pageNode: VNode | void = Page.getPageWithContextId(appContainer.contextId as string) if (!pageNode) return true if (!pageNode.props.beforePop) return true const beforePopRes = pageNode.props.beforePop() if (beforePopRes === false) return false if (beforePopRes instanceof Promise) { const finalRes = await beforePopRes if (finalRes === false) return false } return true } static invokePageOnShow(contextId: string) { const pageNode: VNode | void = Page.getPageWithContextId(contextId) if (!pageNode) return appContainer.contextId = contextId pageNode.props.onShow && pageNode.props.onShow(); } static invokePageOnHide(contextId: string) { const pageNode: VNode | void = this.getPageWithContextId(contextId) if (!pageNode) return pageNode.props.onHide && pageNode.props.onHide(); } static invokePageOnResume(contextId: string) { const pageNode: VNode | void = Page.getPageWithContextId(contextId) if (!pageNode) return appContainer.contextId = contextId pageNode.props.onResume && pageNode.props.onResume(); } static invokePageOnPause(contextId: string) { const pageNode: VNode | void = this.getPageWithContextId(contextId) if (!pageNode) return pageNode.props.onPause && pageNode.props.onPause(); } private static getPageWithContextId(contextId: string): VNode | void { if (appContainer.isEmpty) return const targetPageNode: VNode | void = appContainer.getPageDataWithContextId(contextId) if (!targetPageNode) return return targetPageNode.pageNode } } // 顶部导航栏组件 export class AppBar extends BasicWidget<AppBarProps, any> { private __lastTitle: string updateTitle(title: string) { const lastTitle: string = !Util.isNil(this.__lastTitle) ? this.__lastTitle : (this.props.title || '') if (lastTitle === title) return this.__lastTitle = title __setNavProps(this, FlutterMethodChannelType.updateTitle, { title }) } } // 容器组件 export class Container extends BasicWidget<ContainerProps, any> { } /** * 堆叠组件 * StackView size 有其内部的所有非 absolute 节点撑起 * 至少需要有一个非 absolute 的子节点来撑起 StackView size,否则 StackView 将不可见 * 子节点可以直接使用 absolute 进行定位 * 在未设置 absolute 的情况下,所有子节点会以容器左上角为锚点堆叠放置 */ export class StackView extends BasicWidget<StackViewProps, any> { } // 滑动容器组件 export class ScrollView extends BasicWidget<ScrollViewProps, any> { scrollTo(offset: number, duration: number = AnimationDuration) { __setNavProps(this, FlutterMethodChannelType.scrollTo, { offset, duration }) } } // 列表容器组件 export class ListView extends BasicWidget<ListViewProps, any> { scrollTo(offset: number, duration: number = AnimationDuration) { __setNavProps(this, FlutterMethodChannelType.scrollTo, { offset, duration }) } stopAsyncOperate(type: 'refresh' | 'loadMore') { __setNavProps(this, FlutterMethodChannelType.stopAsyncOperate, { type }) } } export class NestScrollView extends BasicWidget<NestScrollViewProps, any> { open() { __setNavProps(this, FlutterMethodChannelType.setNestScrollViewStatus, { isOpened: true }) } // 关闭ScrollView(下滑) close() { __setNavProps(this, FlutterMethodChannelType.setNestScrollViewStatus, { isOpened: false }) } } export class DrawerScrollView extends BasicWidget<DrawerScrollViewProps, any> { } export class DragableScrollView extends BasicWidget<DragableScrollViewProps, any> { scrollTo(offset: number, duration: number = AnimationDuration) { __setNavProps(this, FlutterMethodChannelType.scrollTo, { offset, duration }) } dragPositionAnimateTo(positionType: 'initial' | 'max' | 'min') { __setNavProps(this, FlutterMethodChannelType.dragPositionAnimateTo, { positionType }) } } export class SwipeActionsView extends BasicWidget<SwipeActionsViewProps, any> { openActions() { __setNavProps(this, FlutterMethodChannelType.openActions, {}) } closeActions() { __setNavProps(this, FlutterMethodChannelType.closeActions, {}) } } SwipeActionsView.childrenRule = new ChildrenRule({ widgetName: 'SwipeActionsView', length: 0, }) export class SwiperView extends BasicWidget<SwiperViewProps, any> { swipeTo(index: number, duration: number = AnimationDuration) { __setNavProps(this, FlutterMethodChannelType.swipeTo, { index, duration }) } } export class NativeView extends BasicWidget<NativeViewProps, any> { refresh(params: any = {}) { this.invokeCustomMethod('refresh', params) } destroy(params: any = {}) { this.invokeCustomMethod('destroy', params) } invokeCustomMethod(methodName: string, methodParams: any = {}) { MethodChannel.invokeNativeViewMethod({ methodName, methodParams, viewType: this.props.type, viewParams: this.props.params || {} }) } } /** * 数据展示 */ // 图标组件 export class Icon extends BasicWidget<IconProps, any> { } Icon.childrenRule = new ChildrenRule({ widgetName: 'Icon', length: 0 }) // 图片组件 export class Image extends BasicWidget<ImageProps, any> { } Image.childrenRule = new ChildrenRule({ length: 0, widgetName: 'Image' }) // 图片组件 export class QrImage extends BasicWidget<QrImageProps, any> { } QrImage.childrenRule = new ChildrenRule({ length: 0, widgetName: 'QrImage' }) // 文本组件 export class Text extends BasicWidget<TextProps, any> { } Text.childrenRule = new ChildrenRule({ name: 'text', widgetName: 'Text', ruleFunc: (children: any[]) => children.map((child: any) => child != undefined ? child.toString() : '').join('') }) // 无限旋转组件 export class Spin extends BasicWidget<SpinProps, any> { } Spin.childrenRule = new ChildrenRule({ widgetName: 'Spin', length: 0, }) // 旋转刷新组件 export class Refresh extends BasicWidget<RefreshProps, any> { } Refresh.childrenRule = new ChildrenRule({ widgetName: 'Refresh', length: 0, }) // 通知栏组件 export class NoticeBar extends BasicWidget<NoticeBarProps, any> { } NoticeBar.childrenRule = new ChildrenRule({ widgetName: 'NoticeBar', }) /** * 表单元素 */ // 按钮组件 export class Button extends BasicWidget<ButtonProps, any> { } Button.childrenRule = new ChildrenRule({ widgetName: 'Button', name: 'child', length: 1, }) // 单选框组件 export class Radio extends BasicWidget<RadioProps, any> { } Radio.childrenRule = new ChildrenRule({ length: 1, name: 'title', widgetName: 'Radio' }) // 开关组件 export class Switch extends BasicWidget<SwitchProps, any> { } Switch.childrenRule = new ChildrenRule({ length: 0, widgetName: 'Switch' }) // 复选框组件 export class Checkbox extends BasicWidget<CheckboxProps, any> { } Checkbox.childrenRule = new ChildrenRule({ length: 1, name: 'title', widgetName: 'Checkbox' }) // 输入框组件 export class Input extends BasicWidget<InputProps, any> { setValue(value: string) { __setNavProps(this, FlutterMethodChannelType.setValue, { value }) } focus() { __setNavProps(this, FlutterMethodChannelType.triggerFocus, { type: 'focus' }) } blur() { __setNavProps(this, FlutterMethodChannelType.triggerFocus, { type: 'blur' }) } } Input.childrenRule = new ChildrenRule({ length: 0, widgetName: 'Input' }) function __setNavProps(widget: Widget<any, any>, method: FlutterMethodChannelType, params: object = {}) { const vNode: VNode = widget.__vNode__ if (!vNode.hasMount) return MethodChannel.call({ method, params: { pageName: vNode.pageName, widgetId: vNode.nodeId, ...params }, }) } // 选择组件 export class Picker extends BasicWidget<PickerProps, any> { // 跳转到指定位置 jumpTo(index: number) { __setNavProps(this, FlutterMethodChannelType.jumpTo, { index }) } // 滚动到指定位置 animateTo(index: number, duration: number = AnimationDuration) { __setNavProps(this, FlutterMethodChannelType.animateTo, { index, duration }) } } Picker.childrenRule = new ChildrenRule({ widgetName: 'Picker' }) // 顶部tab控制器 export class TabView extends BasicWidget<TabViewProps, any> { switchTo(index: number) { __setNavProps(this, FlutterMethodChannelType.switchTo, { index }) } } TabView.childrenRule = new ChildrenRule({ widgetName: 'TabView' }) export class GridView extends BasicWidget<GridViewProps, any> { scrollTo(offset: number, duration: number = AnimationDuration) { __setNavProps(this, FlutterMethodChannelType.scrollTo, { offset, duration }) } } export class VideoView extends BasicWidget<VideoViewProps, any> { play() { __setNavProps(this, FlutterMethodChannelType.play, {}) } pause() { __setNavProps(this, FlutterMethodChannelType.pause, {}) } seekTo(duration: number) { __setNavProps(this, FlutterMethodChannelType.seekTo, { duration }) } setVolume(volume: number) { __setNavProps(this, FlutterMethodChannelType.setVolume, { volume }) } } VideoView.childrenRule = new ChildrenRule({ widgetName: 'VideoView' }) export class AudioView extends BasicWidget<AudioViewProps, any> { play() { __setNavProps(this, FlutterMethodChannelType.play, {}) } pause() { __setNavProps(this, FlutterMethodChannelType.pause, {}) } seekTo(duration: number) { __setNavProps(this, FlutterMethodChannelType.seekTo, { duration }) } setVolume(volume: number) { __setNavProps(this, FlutterMethodChannelType.setVolume, { volume }) } setSourceUrl(url: string) { __setNavProps(this, FlutterMethodChannelType.setSourceUrl, { url }) } } AudioView.childrenRule = new ChildrenRule({ widgetName: 'AudioView' }) //Pdf预览组件 export class PdfView extends BasicWidget<PdfViewProps, any> { openFile(filePath: String){ __setNavProps(this, FlutterMethodChannelType.openFile, {filePath}) } setPage(page: number){ __setNavProps(this, FlutterMethodChannelType.setPage, {page}) } setScale(centerX: number, centerY: number, scale: number, pdfViewWidth: number, pdfViewHeight: number, isTV: boolean){ __setNavProps(this, FlutterMethodChannelType.setScale, {centerX, centerY, scale, pdfViewWidth, pdfViewHeight, isTV}) } switchTheme(){ __setNavProps(this, FlutterMethodChannelType.switchTheme, {}) } getPageCount(){ __setNavProps(this, FlutterMethodChannelType.getPageCount, {}) } getCurrentPage(){ __setNavProps(this, FlutterMethodChannelType.getCurrentPage, {}) } chooseLocalFile(){ __setNavProps(this, FlutterMethodChannelType.chooseLocalFile, {}) } } PdfView.childrenRule = new ChildrenRule({ widgetName: 'PdfView' }) // 转盘组件 export class Spinningwheel extends BasicWidget<SpinningWheelProps, any> { } Spinningwheel.childrenRule = new ChildrenRule({ widgetName: 'Spinningwheel', length: 0, }) // 自定义内容转盘组件 export class Turntable extends BasicWidget<TurntableProps, any> { } Turntable.childrenRule = new ChildrenRule({ widgetName: 'Turntable', length: 0, }) export default { Page, AppBar, Container, StackView, ScrollView, ListView, NestScrollView, DrawerScrollView, DragableScrollView, SwipeActionsView, SwiperView, NativeView, Icon, Image, QrImage, Text, Spin, Refresh, NoticeBar, Button, Radio, Checkbox, Input, Switch, Picker, TabView, Spinningwheel, Turntable, GridView, VideoView, AudioView, PdfView, }