sodesu-comment
Version:
Comment system with SolidJS
52 lines (48 loc) • 1.48 kB
text/typescript
import type { ReactiveComment } from './commentListState';
import { makePersisted } from '@solid-primitives/storage';
import { updateComment } from '@waline/api';
import { createRoot, createSignal } from 'solid-js';
import configProvider from './configProvider';
import userInfoState from './userInfoState';
export type LikeID = number | string;
const likeState = createRoot(() => {
const [likes, setLikes] = makePersisted(createSignal<LikeID[]>([]), {
storage: localStorage,
name: 'WALINE_LIKE',
deserialize: (data) => {
try {
return JSON.parse(data);
} catch (e) {
return [];
}
},
serialize: (data) => JSON.stringify(data),
});
return { likes, setLikes };
});
export async function handleLike(comment: ReactiveComment): Promise<void> {
const { config } = configProvider;
const { objectId } = comment;
const { likes, setLikes } = likeState;
const hasLiked = !!likes()?.includes(objectId);
await updateComment({
serverURL: config().serverURL,
lang: config().lang,
objectId,
token: userInfoState.userInfo()!.token,
comment: { like: !hasLiked },
});
if (hasLiked) {
setLikes((ls) => ls!.filter((id) => id !== objectId));
} else {
setLikes((ls) => {
if (!ls) return [objectId];
if (ls.length > 50) {
ls.shift();
}
return ls.concat(objectId);
});
}
comment.setLike((like) => (like || 0) + (hasLiked ? -1 : 1));
}
export default likeState;