refactor: add typescript definition

This commit is contained in:
HD
2022-06-28 10:08:36 +08:00
parent e0bbbf4f30
commit 2a3535ea13
30 changed files with 325 additions and 204 deletions
+9 -7
View File
@@ -8,6 +8,7 @@ import { fullfillContacts } from "../slices/contacts";
import BASE_URL, { ContentTypes } from "../config";
import { onMessageSendStarted } from "./handlers";
import handleChatMessage from "../../common/hook/useStreaming/chat.handler";
import { User } from "../../types/auth";
export const contactApi = createApi({
reducerPath: "contactApi",
@@ -15,14 +16,15 @@ export const contactApi = createApi({
endpoints: (builder) => ({
getContacts: builder.query({
query: () => ({ url: `user` }),
transformResponse: (data) => {
transformResponse: (data: User[]) => {
return data.map((user) => {
const avatar =
user.avatar_updated_at == 0
? ""
: `${BASE_URL}/resource/avatar?uid=${user.uid}&t=${user.avatar_updated_at}`;
user.avatar = avatar;
return user;
return {
...user,
avatar:
user.avatar_updated_at == 0
? ""
: `${BASE_URL}/resource/avatar?uid=${user.uid}&t=${user.avatar_updated_at}`
};
});
},
async onQueryStarted(data, { dispatch, queryFulfilled }) {
+14 -10
View File
@@ -5,11 +5,18 @@ import baseQuery from "./base.query";
const defaultExpireDuration = 7 * 24 * 60 * 60;
// todo: doc
interface GetServerResponse {}
interface GetThirdPartySecretResponse {}
interface UpdateThirdPartySecretResponse {}
// interface GetServerVersionResponse {}
interface GetLoginConfigResponse {}
export const serverApi = createApi({
reducerPath: "serverApi",
baseQuery,
endpoints: (builder) => ({
getServer: builder.query({
getServer: builder.query<GetServerResponse, void>({
query: () => ({ url: `admin/system/organization` }),
transformResponse: (data) => {
data.logo = `${BASE_URL}/resource/organization/logo?t=${+new Date()}`;
@@ -24,7 +31,7 @@ export const serverApi = createApi({
}
}
}),
getThirdPartySecret: builder.query({
getThirdPartySecret: builder.query<GetThirdPartySecretResponse, void>({
query: () => ({
// headers: {
// "content-type": "text/plain",
@@ -35,7 +42,7 @@ export const serverApi = createApi({
}),
keepUnusedDataFor: 0
}),
updateThirdPartySecret: builder.mutation({
updateThirdPartySecret: builder.mutation<UpdateThirdPartySecretResponse, void>({
query: () => ({
url: `/admin/system/third_party_secret`,
method: "POST",
@@ -45,14 +52,11 @@ export const serverApi = createApi({
getMetrics: builder.query({
query: () => ({ url: `/admin/system/metrics` })
}),
getServerVersion: builder.query({
getServerVersion: builder.query<string, void>({
query: () => ({
headers: {
// "content-type": "text/plain",
accept: "text/plain"
},
headers: { accept: "text/plain" },
url: `/admin/system/version`,
responseHandler: (response) => response.text()
responseHandler: (response: Response) => response.text()
})
}),
getFirebaseConfig: builder.query({
@@ -115,7 +119,7 @@ export const serverApi = createApi({
body: data
})
}),
getLoginConfig: builder.query({
getLoginConfig: builder.query<GetLoginConfigResponse, void>({
query: () => ({ url: `admin/login/config` })
}),
updateLoginConfig: builder.mutation({
+27 -30
View File
@@ -1,8 +1,8 @@
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
import { getNonNullValues } from '../../common/utils';
import BASE_URL from '../config';
import { User } from '../../types/auth';
import { UserLog, UserState } from '../../types/sse';
import { createSlice, PayloadAction } from "@reduxjs/toolkit";
import { getNonNullValues } from "../../common/utils";
import BASE_URL from "../config";
import { User } from "../../types/auth";
import { UserLog, UserState } from "../../types/sse";
export interface StoredUser extends User {
online?: boolean;
@@ -20,31 +20,21 @@ const initialState: State = {
};
const contactsSlice = createSlice({
name: 'contacts',
name: "contacts",
initialState,
reducers: {
resetContacts() {
return initialState;
},
fullfillContacts(state, action: PayloadAction<User[]>) {
console.log('set Contacts store', action);
fullfillContacts(state, action: PayloadAction<StoredUser[]>) {
const contacts = action.payload || [];
state.ids = contacts.map(({ uid }) => uid);
// old code
// state.byId = Object.fromEntries(
// contacts.map((c) => {
// const { uid } = c;
// return [uid, c];
// })
// );
contacts.forEach(u => {
state.byId[u.uid] = {
...u,
// todo: add avatar field
avatar: ''
};
});
state.byId = Object.fromEntries(
contacts.map((c) => {
const { uid } = c;
return [uid, c];
})
);
},
removeContact(state, action: PayloadAction<number>) {
const uid = action.payload;
@@ -55,28 +45,35 @@ const contactsSlice = createSlice({
const changeLogs = action.payload;
changeLogs.forEach(({ action, uid, ...rest }) => {
switch (action) {
case 'update': {
case "update": {
const vals = getNonNullValues(rest);
if (state.byId[uid]) {
Object.keys(vals).forEach((k) => {
state.byId[uid][k] = vals[k];
if (k == 'avatar_updated_at') {
state.byId[uid]![k] = vals[k];
if (k == "avatar_updated_at") {
state.byId[uid]!.avatar = `${BASE_URL}/resource/avatar?uid=${uid}&t=${vals[k]}`;
}
});
}
break;
}
case 'create': {
// todo: missing properties avatar, create_by
state.byId[uid] = { uid, ...rest };
case "create": {
state.byId[uid] = {
uid,
avatar:
rest.avatar_updated_at === 0
? ""
: `${BASE_URL}/resource/avatar?uid=${uid}&t=${rest.avatar_updated_at}`,
create_by: "", // todo: missing properties create_by
...rest
};
const idx = state.ids.findIndex((i) => i == uid);
if (idx == -1) {
state.ids.push(uid);
}
break;
}
case 'delete': {
case "delete": {
const idx = state.ids.findIndex((i) => i == uid);
if (idx > -1) {
state.ids.splice(idx, 1);
+4 -4
View File
@@ -1,6 +1,6 @@
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
import { ChannelMessage } from '../../types/channel';
import { EntityId } from '../../types/common';
import { createSlice, PayloadAction } from "@reduxjs/toolkit";
import { EntityId } from "../../types/common";
import { ChatEvent } from "../../types/sse";
export interface State {
[gid: number]: number[] | undefined;
@@ -18,7 +18,7 @@ const channelMsgSlice = createSlice({
fullfillChannelMsg(state, action: PayloadAction<State>) {
return action.payload;
},
addChannelMsg(state, action) {
addChannelMsg(state, action: PayloadAction<ChatEvent>) {
const { id, mid, local_id = null } = action.payload;
if (state[id]) {
const midExsited = state[id]!.findIndex((id) => id == mid) > -1;