This repository has been archived by the owner on Sep 11, 2024. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 833
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1653 from matrix-org/luke/feature-ordered-tag-panel
DnD Ordered TagPanel
- Loading branch information
Showing
13 changed files
with
610 additions
and
88 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
/* | ||
Copyright 2017 New Vector Ltd | ||
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 { asyncAction } from './actionCreators'; | ||
|
||
const GroupActions = {}; | ||
|
||
/** | ||
* Creates an action thunk that will do an asynchronous request to fetch | ||
* the groups to which a user is joined. | ||
* | ||
* @param {MatrixClient} matrixClient the matrix client to query. | ||
* @returns {function} an action thunk that will dispatch actions | ||
* indicating the status of the request. | ||
* @see asyncAction | ||
*/ | ||
GroupActions.fetchJoinedGroups = function(matrixClient) { | ||
return asyncAction('GroupActions.fetchJoinedGroups', () => matrixClient.getJoinedGroups()); | ||
}; | ||
|
||
export default GroupActions; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
/* | ||
Copyright 2017 New Vector Ltd | ||
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 dis from '../dispatcher'; | ||
|
||
// TODO: migrate from sync_state to MatrixActions.sync so that more js-sdk events | ||
// become dispatches in the same place. | ||
/** | ||
* Create a MatrixActions.sync action that represents a MatrixClient `sync` event, | ||
* each parameter mapping to a key-value in the action. | ||
* | ||
* @param {MatrixClient} matrixClient the matrix client | ||
* @param {string} state the current sync state. | ||
* @param {string} prevState the previous sync state. | ||
* @returns {Object} an action of type MatrixActions.sync. | ||
*/ | ||
function createSyncAction(matrixClient, state, prevState) { | ||
return { | ||
action: 'MatrixActions.sync', | ||
state, | ||
prevState, | ||
matrixClient, | ||
}; | ||
} | ||
|
||
/** | ||
* @typedef AccountDataAction | ||
* @type {Object} | ||
* @property {string} action 'MatrixActions.accountData'. | ||
* @property {MatrixEvent} event the MatrixEvent that triggered the dispatch. | ||
* @property {string} event_type the type of the MatrixEvent, e.g. "m.direct". | ||
* @property {Object} event_content the content of the MatrixEvent. | ||
*/ | ||
|
||
/** | ||
* Create a MatrixActions.accountData action that represents a MatrixClient `accountData` | ||
* matrix event. | ||
* | ||
* @param {MatrixClient} matrixClient the matrix client. | ||
* @param {MatrixEvent} accountDataEvent the account data event. | ||
* @returns {AccountDataAction} an action of type MatrixActions.accountData. | ||
*/ | ||
function createAccountDataAction(matrixClient, accountDataEvent) { | ||
return { | ||
action: 'MatrixActions.accountData', | ||
event: accountDataEvent, | ||
event_type: accountDataEvent.getType(), | ||
event_content: accountDataEvent.getContent(), | ||
}; | ||
} | ||
|
||
/** | ||
* This object is responsible for dispatching actions when certain events are emitted by | ||
* the given MatrixClient. | ||
*/ | ||
export default { | ||
// A list of callbacks to call to unregister all listeners added | ||
_matrixClientListenersStop: [], | ||
|
||
/** | ||
* Start listening to certain events from the MatrixClient and dispatch actions when | ||
* they are emitted. | ||
* @param {MatrixClient} matrixClient the MatrixClient to listen to events from | ||
*/ | ||
start(matrixClient) { | ||
this._addMatrixClientListener(matrixClient, 'sync', createSyncAction); | ||
this._addMatrixClientListener(matrixClient, 'accountData', createAccountDataAction); | ||
}, | ||
|
||
/** | ||
* Start listening to events of type eventName on matrixClient and when they are emitted, | ||
* dispatch an action created by the actionCreator function. | ||
* @param {MatrixClient} matrixClient a MatrixClient to register a listener with. | ||
* @param {string} eventName the event to listen to on MatrixClient. | ||
* @param {function} actionCreator a function that should return an action to dispatch | ||
* when given the MatrixClient as an argument as well as | ||
* arguments emitted in the MatrixClient event. | ||
*/ | ||
_addMatrixClientListener(matrixClient, eventName, actionCreator) { | ||
const listener = (...args) => { | ||
dis.dispatch(actionCreator(matrixClient, ...args)); | ||
}; | ||
matrixClient.on(eventName, listener); | ||
this._matrixClientListenersStop.push(() => { | ||
matrixClient.removeListener(eventName, listener); | ||
}); | ||
}, | ||
|
||
/** | ||
* Stop listening to events. | ||
*/ | ||
stop() { | ||
this._matrixClientListenersStop.forEach((stopListener) => stopListener()); | ||
}, | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
/* | ||
Copyright 2017 New Vector Ltd | ||
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 Analytics from '../Analytics'; | ||
import { asyncAction } from './actionCreators'; | ||
import TagOrderStore from '../stores/TagOrderStore'; | ||
|
||
const TagOrderActions = {}; | ||
|
||
/** | ||
* Creates an action thunk that will do an asynchronous request to | ||
* commit TagOrderStore.getOrderedTags() to account data and dispatch | ||
* actions to indicate the status of the request. | ||
* | ||
* @param {MatrixClient} matrixClient the matrix client to set the | ||
* account data on. | ||
* @returns {function} an action thunk that will dispatch actions | ||
* indicating the status of the request. | ||
* @see asyncAction | ||
*/ | ||
TagOrderActions.commitTagOrdering = function(matrixClient) { | ||
return asyncAction('TagOrderActions.commitTagOrdering', () => { | ||
// Only commit tags if the state is ready, i.e. not null | ||
const tags = TagOrderStore.getOrderedTags(); | ||
if (!tags) { | ||
return; | ||
} | ||
|
||
Analytics.trackEvent('TagOrderActions', 'commitTagOrdering'); | ||
return matrixClient.setAccountData('im.vector.web.tag_ordering', {tags}); | ||
}); | ||
}; | ||
|
||
export default TagOrderActions; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
/* | ||
Copyright 2017 New Vector Ltd | ||
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. | ||
*/ | ||
|
||
/** | ||
* Create an action thunk that will dispatch actions indicating the current | ||
* status of the Promise returned by fn. | ||
* | ||
* @param {string} id the id to give the dispatched actions. This is given a | ||
* suffix determining whether it is pending, successful or | ||
* a failure. | ||
* @param {function} fn a function that returns a Promise. | ||
* @returns {function} an action thunk - a function that uses its single | ||
* argument as a dispatch function to dispatch the | ||
* following actions: | ||
* `${id}.pending` and either | ||
* `${id}.success` or | ||
* `${id}.failure`. | ||
*/ | ||
export function asyncAction(id, fn) { | ||
return (dispatch) => { | ||
dispatch({action: id + '.pending'}); | ||
fn().then((result) => { | ||
dispatch({action: id + '.success', result}); | ||
}).catch((err) => { | ||
dispatch({action: id + '.failure', err}); | ||
}); | ||
}; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.