Skip to content

Commit

Permalink
[added] MotionProperty
Browse files Browse the repository at this point in the history
Summary: Related: #194

Reviewers: O2 Material Motion, O3 Material JavaScript platform reviewers, #material_motion, featherless

Reviewed By: O2 Material Motion, #material_motion, featherless

Subscribers: featherless

Tags: #material_motion

Differential Revision: http://codereview.cc/D3129
  • Loading branch information
appsforartists committed May 2, 2017
1 parent 52c2e42 commit f3520bb
Show file tree
Hide file tree
Showing 5 changed files with 112 additions and 4 deletions.
41 changes: 41 additions & 0 deletions packages/core/src/properties/MotionProperty.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/** @license
* Copyright 2016 - present The Material Motion Authors. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy
* of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/

import {
MotionObservable,
} from '../observables';

// ObservableWithMotionOperators isn't referenced in this file, but TypeScript
// gets mad if you remove it. (MotionProperty is using MotionDebounceable from
// an external module)
import {
ObservableWithMotionOperators,
withMotionOperators,
} from '../operators';

import {
Operable,
} from '../types';

import {
ReactiveProperty,
} from './ReactiveProperty';

export class OperableProperty<T> extends ReactiveProperty<T> implements Operable<T> {
_observableConstructor = MotionObservable;
}
export const MotionProperty = withMotionOperators(OperableProperty);
export default MotionProperty;
64 changes: 64 additions & 0 deletions packages/core/src/properties/__tests__/motionProperty.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
/** @license
* Copyright 2016 - present The Material Motion Authors. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy
* of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/

import { expect } from 'chai';

import {
beforeEach,
describe,
it,
} from 'mocha-sugar-free';

import {
spy,
} from 'sinon';

import MotionProperty from '../MotionProperty';

declare function require(name: string);

// chai really doesn't like being imported as an ES2015 module; will be fixed in v4
require('chai').use(
require('sinon-chai')
);

describe('motionProperty',
() => {
let property;
let listener;

beforeEach(
() => {
property = new MotionProperty();

listener = spy();
}
);

it(`should be a property with operators`,
() => {
property.pluck('a').subscribe(listener);

property.write({ 'a': 1 });

expect(listener).to.have.been.calledOnce.and.to.have.been.calledWith(1);
}
);

// It would be more thorough to re-run the ReactiveProperty and operator
// test suites here, but I'm not sure it adds value/
}
);
6 changes: 3 additions & 3 deletions packages/core/src/properties/createProperty.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@
* under the License.
*/

import ReactiveProperty from './ReactiveProperty';
import MotionProperty from './MotionProperty';

export function createProperty<T>({ initialValue }: { initialValue?: T} = {}): ReactiveProperty<T> {
const result = new ReactiveProperty<T>();
export function createProperty<T>({ initialValue }: { initialValue?: T} = {}): MotionProperty<T> {
const result = new MotionProperty<T>();

if (initialValue !== undefined) {
result.write(initialValue);
Expand Down
3 changes: 3 additions & 0 deletions packages/core/src/properties/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@
* under the License.
*/

export * from './MotionProperty';
export { default as MotionProperty } from './MotionProperty';

export * from './ReactiveProperty';
export { default as ReactiveProperty } from './ReactiveProperty';

Expand Down
2 changes: 1 addition & 1 deletion packages/demos-react/src/QuickiePointerEventTest.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ export class QuickiePointerEventTest extends React.Component {

const drag$ = dragSystem(draggable);
const velocity$ = drag$.velocity(
MotionObservable.from(draggable.state)._filter(
draggable.state._filter(
state => state === GestureRecognitionState.RECOGNIZED
)
);
Expand Down

0 comments on commit f3520bb

Please sign in to comment.