noti
This commit is contained in:
parent
4974336077
commit
d0d86877a6
|
@ -7,6 +7,7 @@ interface Notification {
|
||||||
message?: string;
|
message?: string;
|
||||||
member?: Member;
|
member?: Member;
|
||||||
confirmDate?: Date;
|
confirmDate?: Date;
|
||||||
|
url?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default Notification;
|
export default Notification;
|
||||||
|
|
|
@ -9,6 +9,9 @@ import * as asyncRequestActions from '@overflow/commons/redux/action/asyncReques
|
||||||
import Member from '@overflow/member/api/model/Member';
|
import Member from '@overflow/member/api/model/Member';
|
||||||
import * as readAllActions from '../redux/action/read_all';
|
import * as readAllActions from '../redux/action/read_all';
|
||||||
import PageParams from '@overflow/commons/api/model/PageParams';
|
import PageParams from '@overflow/commons/api/model/PageParams';
|
||||||
|
import Notification from '@overflow/notification/api/model/Notification';
|
||||||
|
import * as readUnconfirmedCntActions from '../redux/action/read_unconfirmed_count';
|
||||||
|
import * as readActions from '../redux/action/read';
|
||||||
|
|
||||||
export function mapStateToProps(state: any, props: any): StateProps {
|
export function mapStateToProps(state: any, props: any): StateProps {
|
||||||
return {
|
return {
|
||||||
|
@ -22,6 +25,17 @@ export function mapDispatchToProps(dispatch: Dispatch<any>): DispatchProps {
|
||||||
dispatch(asyncRequestActions.request('NotificationService', 'readAllByMember',
|
dispatch(asyncRequestActions.request('NotificationService', 'readAllByMember',
|
||||||
readAllActions.REQUEST, JSON.stringify(member), JSON.stringify(pageParams)));
|
readAllActions.REQUEST, JSON.stringify(member), JSON.stringify(pageParams)));
|
||||||
},
|
},
|
||||||
|
onRedirectByUrl: (url: string) => {
|
||||||
|
dispatch(routerPush(url));
|
||||||
|
},
|
||||||
|
onMarkAsRead: (noti: Notification) => {
|
||||||
|
Promise.all([
|
||||||
|
dispatch(asyncRequestActions.request('NotificationService', 'markAsRead',
|
||||||
|
readActions.REQUEST, JSON.stringify(noti))),
|
||||||
|
dispatch(asyncRequestActions.request('NotificationService', 'readUnconfirmedCount',
|
||||||
|
readUnconfirmedCntActions.REQUEST, JSON.stringify(noti.member))),
|
||||||
|
]);
|
||||||
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,8 +7,10 @@ import {
|
||||||
import { push as routerPush } from 'react-router-redux';
|
import { push as routerPush } from 'react-router-redux';
|
||||||
import * as asyncRequestActions from '@overflow/commons/redux/action/asyncRequest';
|
import * as asyncRequestActions from '@overflow/commons/redux/action/asyncRequest';
|
||||||
import Member from '@overflow/member/api/model/Member';
|
import Member from '@overflow/member/api/model/Member';
|
||||||
|
import Notification from '@overflow/notification/api/model/Notification';
|
||||||
import * as readAllUnconfirmedActions from '../redux/action/read_all_unconfirmed';
|
import * as readAllUnconfirmedActions from '../redux/action/read_all_unconfirmed';
|
||||||
import * as readUnconfirmedCntActions from '../redux/action/read_unconfirmed_count';
|
import * as readUnconfirmedCntActions from '../redux/action/read_unconfirmed_count';
|
||||||
|
import * as readActions from '../redux/action/read';
|
||||||
import PageParams from '@overflow/commons/api/model/PageParams';
|
import PageParams from '@overflow/commons/api/model/PageParams';
|
||||||
|
|
||||||
export function mapStateToProps(state: any, props: any): StateProps {
|
export function mapStateToProps(state: any, props: any): StateProps {
|
||||||
|
@ -44,6 +46,19 @@ export function mapDispatchToProps(dispatch: Dispatch<any>): DispatchProps {
|
||||||
readUnconfirmedCntActions.REQUEST, JSON.stringify(member))),
|
readUnconfirmedCntActions.REQUEST, JSON.stringify(member))),
|
||||||
]);
|
]);
|
||||||
},
|
},
|
||||||
|
onRedirectByUrl: (url: string) => {
|
||||||
|
dispatch(routerPush(url));
|
||||||
|
},
|
||||||
|
onMarkAsRead: (noti: Notification) => {
|
||||||
|
// dispatch(asyncRequestActions.request('NotificationService', 'markAsRead',
|
||||||
|
// readAllUnconfirmedActions.REQUEST, JSON.stringify(noti)));
|
||||||
|
Promise.all([
|
||||||
|
dispatch(asyncRequestActions.request('NotificationService', 'markAsRead',
|
||||||
|
readActions.REQUEST, JSON.stringify(noti))),
|
||||||
|
dispatch(asyncRequestActions.request('NotificationService', 'readUnconfirmedCount',
|
||||||
|
readUnconfirmedCntActions.REQUEST, JSON.stringify(noti.member))),
|
||||||
|
]);
|
||||||
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,8 @@ export interface StateProps {
|
||||||
|
|
||||||
export interface DispatchProps {
|
export interface DispatchProps {
|
||||||
onReadAll(member: Member, pageParams: PageParams): void;
|
onReadAll(member: Member, pageParams: PageParams): void;
|
||||||
|
onRedirectByUrl(url: string): void;
|
||||||
|
onMarkAsRead(notification: Notification): void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type Props = StateProps & DispatchProps;
|
export type Props = StateProps & DispatchProps;
|
||||||
|
@ -57,7 +59,7 @@ export class NotificationList extends React.Component<Props, State> {
|
||||||
return <div>No user notifications found. </div>;
|
return <div>No user notifications found. </div>;
|
||||||
}
|
}
|
||||||
return this.props.notiPage.content.map((noti: Notification, index: number) => (
|
return this.props.notiPage.content.map((noti: Notification, index: number) => (
|
||||||
<Table.Row key={index} active={this.checkRead(noti)}>
|
<Table.Row key={index} active={this.checkRead(noti)} onClick={this.handleSelect.bind(this, noti)} >
|
||||||
<Table.Cell textAlign={'center'} collapsing>{noti.id}</Table.Cell>
|
<Table.Cell textAlign={'center'} collapsing>{noti.id}</Table.Cell>
|
||||||
<Table.Cell textAlign={'center'} collapsing>{noti.createDate}</Table.Cell>
|
<Table.Cell textAlign={'center'} collapsing>{noti.createDate}</Table.Cell>
|
||||||
<Table.Cell textAlign={'center'} collapsing>{noti.title}</Table.Cell>
|
<Table.Cell textAlign={'center'} collapsing>{noti.title}</Table.Cell>
|
||||||
|
@ -96,7 +98,8 @@ export class NotificationList extends React.Component<Props, State> {
|
||||||
}
|
}
|
||||||
|
|
||||||
private handleSelect = (selected: Notification) => {
|
private handleSelect = (selected: Notification) => {
|
||||||
console.log('handleSelect');
|
this.props.onMarkAsRead(selected);
|
||||||
|
this.props.onRedirectByUrl(selected.url);
|
||||||
}
|
}
|
||||||
private handleSort = (col: string, direction: string) => {
|
private handleSort = (col: string, direction: string) => {
|
||||||
this.sortCol = col;
|
this.sortCol = col;
|
||||||
|
|
|
@ -20,6 +20,8 @@ export interface DispatchProps {
|
||||||
onRedirectAllNotifications(): void;
|
onRedirectAllNotifications(): void;
|
||||||
onMarkAllAsRead(member: Member, pageParams: PageParams): void;
|
onMarkAllAsRead(member: Member, pageParams: PageParams): void;
|
||||||
onMarkAllAsUnread(member: Member, pageParams: PageParams): void;
|
onMarkAllAsUnread(member: Member, pageParams: PageParams): void;
|
||||||
|
onRedirectByUrl(url: string): void;
|
||||||
|
onMarkAsRead(notification: Notification): void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type Props = StateProps & DispatchProps;
|
export type Props = StateProps & DispatchProps;
|
||||||
|
@ -55,7 +57,8 @@ export class NotificationPopup extends React.Component<Props, State> {
|
||||||
return <div>No user notifications found. </div>;
|
return <div>No user notifications found. </div>;
|
||||||
}
|
}
|
||||||
return this.props.notifications.content.map((item: Notification, index: number) => (
|
return this.props.notifications.content.map((item: Notification, index: number) => (
|
||||||
<List.Item key={index} disabled={item.confirmDate !== null ? true : false} >
|
<List.Item style={this.handleStyle(item)} key={index}
|
||||||
|
onClick={this.handleSelect.bind(this, item)} >
|
||||||
<List.Icon name='bell outline' size='large' verticalAlign='middle' />
|
<List.Icon name='bell outline' size='large' verticalAlign='middle' />
|
||||||
<List.Content>
|
<List.Content>
|
||||||
<List.Header>{item.title}</List.Header>
|
<List.Header>{item.title}</List.Header>
|
||||||
|
@ -65,6 +68,13 @@ export class NotificationPopup extends React.Component<Props, State> {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private handleStyle(noti: Notification): any {
|
||||||
|
if(noti.confirmDate === null) {
|
||||||
|
return {'backgroundColor':'green'};
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public render(): JSX.Element {
|
public render(): JSX.Element {
|
||||||
if(!this.state.show) {
|
if(!this.state.show) {
|
||||||
return null;
|
return null;
|
||||||
|
@ -88,6 +98,14 @@ export class NotificationPopup extends React.Component<Props, State> {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private handleSelect = (noti: Notification): void => {
|
||||||
|
this.props.onMarkAsRead(noti);
|
||||||
|
this.props.onRedirectByUrl(noti.url);
|
||||||
|
this.setState({
|
||||||
|
show: false,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
private handleMark = (): void => {
|
private handleMark = (): void => {
|
||||||
const member: Member = {
|
const member: Member = {
|
||||||
id: 1,
|
id: 1,
|
||||||
|
|
7
src/ts/@overflow/notification/redux/action/read.ts
Normal file
7
src/ts/@overflow/notification/redux/action/read.ts
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
export type REQUEST = '@overflow/notification/read/REQUEST';
|
||||||
|
export type REQUEST_SUCCESS = '@overflow/notification/read/REQUEST/SUCCESS';
|
||||||
|
export type REQUEST_FAILURE = '@overflow/notification/read/REQUEST/FAILURE';
|
||||||
|
|
||||||
|
export const REQUEST: REQUEST = '@overflow/notification/read/REQUEST';
|
||||||
|
export const REQUEST_SUCCESS: REQUEST_SUCCESS = '@overflow/notification/read/REQUEST/SUCCESS';
|
||||||
|
export const REQUEST_FAILURE: REQUEST_FAILURE = '@overflow/notification/read/REQUEST/FAILURE';
|
24
src/ts/@overflow/notification/redux/reducer/read.ts
Normal file
24
src/ts/@overflow/notification/redux/reducer/read.ts
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
import Action from '@overflow/commons/redux/Action';
|
||||||
|
import { ReducersMapObject } from 'redux';
|
||||||
|
import Notification from '@overflow/notification/api/model/Notification';
|
||||||
|
|
||||||
|
import * as ReadActionTypes from '../action/read';
|
||||||
|
import ReadState, { defaultState as ReadDefaultState } from '../state/Read';
|
||||||
|
|
||||||
|
const reducer: ReducersMapObject = {
|
||||||
|
[ReadActionTypes.REQUEST_SUCCESS]:
|
||||||
|
(state: ReadState = ReadDefaultState, action: Action<Notification>):
|
||||||
|
ReadState => {
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
notification: <Notification>action.payload,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
[ReadActionTypes.REQUEST_FAILURE]:
|
||||||
|
(state: ReadState = ReadDefaultState, action: Action<Error>):
|
||||||
|
ReadState => {
|
||||||
|
return state;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default reducer;
|
13
src/ts/@overflow/notification/redux/state/Read.ts
Normal file
13
src/ts/@overflow/notification/redux/state/Read.ts
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
import Notification from '@overflow/notification/api/model/Notification';
|
||||||
|
|
||||||
|
export interface State {
|
||||||
|
readonly notification?: Notification;
|
||||||
|
readonly error?: Error;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const defaultState: State = {
|
||||||
|
notification: undefined,
|
||||||
|
error: undefined,
|
||||||
|
};
|
||||||
|
|
||||||
|
export default State;
|
Loading…
Reference in New Issue
Block a user