refactor: add typescript definition
This commit is contained in:
@@ -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
@@ -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
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user