#38: Enhance new repertory release available notification - partial
This commit is contained in:
@@ -1,17 +1,40 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
import {connect} from 'react-redux';
|
||||||
import * as Constants from '../../../constants';
|
import * as Constants from '../../../constants';
|
||||||
import Button from '../../UI/Button/Button';
|
import Button from '../../UI/Button/Button';
|
||||||
|
import {formatLinesForDisplay, getChangesForRepertoryVersion} from '../../../utils';
|
||||||
|
import {
|
||||||
|
notifyError,
|
||||||
|
notifyInfo
|
||||||
|
} from '../../../redux/actions/error_actions';
|
||||||
|
|
||||||
|
const mapDispatchToProps = dispatch => {
|
||||||
|
return {
|
||||||
|
notifyError: msg => dispatch(notifyError(msg)),
|
||||||
|
notifyInfo: (title, msg) => dispatch(notifyInfo(title, msg)),
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export default connect(null, mapDispatchToProps)(({release, lastItem, notifyError, notifyInfo}) => {
|
||||||
|
const title = '[' + Constants.RELEASE_TYPES[release.Release] + '] ' + release.Display;
|
||||||
|
const displayChanges = async () => {
|
||||||
|
try {
|
||||||
|
const lines = await getChangesForRepertoryVersion(release.VersionString);
|
||||||
|
notifyInfo(title, formatLinesForDisplay(lines));
|
||||||
|
} catch (e) {
|
||||||
|
notifyError(e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
export default ({release, lastItem}) => {
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<h2>{'[' + Constants.RELEASE_TYPES[release.Release] + '] ' + release.Display }</h2>
|
<h2>{title}</h2>
|
||||||
<table cellSpacing={0} cellPadding={0} width="97%">
|
<table cellSpacing={0} cellPadding={0} width="97%">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr style={{height: '4px'}}/>
|
<tr style={{height: '4px'}}/>
|
||||||
<tr>
|
<tr>
|
||||||
<td width="50%">
|
<td width="50%">
|
||||||
<Button buttonStyles={{width: '100%'}}>Changes</Button>
|
<Button buttonStyles={{width: '100%'}} clicked={displayChanges}>Changes</Button>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<div style={{width: 'var(--default_spacing)'}}/>
|
<div style={{width: 'var(--default_spacing)'}}/>
|
||||||
@@ -25,4 +48,4 @@ export default ({release, lastItem}) => {
|
|||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
});
|
||||||
|
|||||||
46
src/utils.js
46
src/utils.js
@@ -1,6 +1,7 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import * as Constants from './constants';
|
import * as Constants from './constants';
|
||||||
import Modal from './components/UI/Modal/Modal';
|
import Modal from './components/UI/Modal/Modal';
|
||||||
|
import axios from 'axios';
|
||||||
|
|
||||||
const ipcRenderer = (!process.versions.hasOwnProperty('electron') && window && window.require) ?
|
const ipcRenderer = (!process.versions.hasOwnProperty('electron') && window && window.require) ?
|
||||||
window.require('electron').ipcRenderer :
|
window.require('electron').ipcRenderer :
|
||||||
@@ -16,6 +17,47 @@ export const extractFileNameFromURL = url => {
|
|||||||
return parts[parts.length - 1];
|
return parts[parts.length - 1];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const formatLinesForDisplay = lines => {
|
||||||
|
let msg = '';
|
||||||
|
for (let i = 1; i < lines.length; i++) {
|
||||||
|
if (i > 1) {
|
||||||
|
msg += '\n';
|
||||||
|
}
|
||||||
|
msg += (lines[i].replace(/(\\#)/gm, '#') + '\n');
|
||||||
|
}
|
||||||
|
return msg;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getChangesForRepertoryVersion = version => {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const url = `https://bitbucket.org/blockstorage/repertory/raw/${version}/CHANGELOG.md`;
|
||||||
|
axios
|
||||||
|
.get(url, {
|
||||||
|
responseType: 'text',
|
||||||
|
})
|
||||||
|
.then(response => {
|
||||||
|
try {
|
||||||
|
let found = false;
|
||||||
|
let ended = false;
|
||||||
|
let lines = response.data
|
||||||
|
.replace(/(\r\n)/gm, '\n')
|
||||||
|
.split('\n')
|
||||||
|
.filter(l => {
|
||||||
|
return !ended && (l.length > 0) && (found
|
||||||
|
? !(ended = l.startsWith('## '))
|
||||||
|
: (found = l.startsWith(`## ${version}`)));
|
||||||
|
});
|
||||||
|
resolve(lines);
|
||||||
|
} catch (e) {
|
||||||
|
reject(e);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
reject(error);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
export const getIPCRenderer = () => {
|
export const getIPCRenderer = () => {
|
||||||
return ipcRenderer;
|
return ipcRenderer;
|
||||||
};
|
};
|
||||||
@@ -37,15 +79,17 @@ export const getNewReleases = (existingReleases, newReleases) => {
|
|||||||
Display: version,
|
Display: version,
|
||||||
Release: Constants.RELEASE_TYPES.indexOf(release),
|
Release: Constants.RELEASE_TYPES.indexOf(release),
|
||||||
Version: newReleases[release].indexOf(version),
|
Version: newReleases[release].indexOf(version),
|
||||||
|
VersionString: version,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
ret.push({
|
ret.push({
|
||||||
Display: '1.1.1',
|
Display: '1.2.2-release',
|
||||||
Release: 1,
|
Release: 1,
|
||||||
Version: 2,
|
Version: 2,
|
||||||
|
VersionString: '1.2.2-release',
|
||||||
});
|
});
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
Reference in New Issue
Block a user