memos/web/src/services/locationService.ts

118 lines
2.4 KiB
TypeScript

import { stringify } from "qs";
import store from "../store";
import { setQuery, setPathname, Query, updateStateWithLocation } from "../store/modules/location";
const updateLocationUrl = (method: "replace" | "push" = "replace") => {
const { query, pathname, hash } = store.getState().location;
let queryString = stringify(query);
if (queryString) {
queryString = "?" + queryString;
} else {
queryString = "";
}
if (method === "replace") {
window.history.replaceState(null, "", pathname + hash + queryString);
} else {
window.history.pushState(null, "", pathname + hash + queryString);
}
};
const locationService = {
getState: () => {
return store.getState().location;
},
updateStateWithLocation: () => {
store.dispatch(updateStateWithLocation());
},
setPathname: (pathname: string) => {
store.dispatch(setPathname(pathname));
updateLocationUrl();
},
pushHistory: (pathname: string) => {
store.dispatch(setPathname(pathname));
updateLocationUrl("push");
},
replaceHistory: (pathname: string) => {
store.dispatch(setPathname(pathname));
updateLocationUrl("replace");
},
setQuery: (query: Query) => {
store.dispatch(setQuery(query));
updateLocationUrl();
},
clearQuery: () => {
store.dispatch(
setQuery({
tag: undefined,
type: undefined,
duration: undefined,
text: undefined,
shortcutId: undefined,
})
);
updateLocationUrl();
},
setMemoTypeQuery: (type?: MemoSpecType) => {
store.dispatch(
setQuery({
type: type,
})
);
updateLocationUrl();
},
setMemoShortcut: (shortcutId?: ShortcutId) => {
store.dispatch(
setQuery({
shortcutId: shortcutId,
})
);
updateLocationUrl();
},
setTextQuery: (text?: string) => {
store.dispatch(
setQuery({
text: text,
})
);
updateLocationUrl();
},
setTagQuery: (tag?: string) => {
store.dispatch(
setQuery({
tag: tag,
})
);
updateLocationUrl();
},
setFromAndToQuery: (from?: number, to?: number) => {
let duration = undefined;
if (from && to && from < to) {
duration = {
from,
to,
};
}
store.dispatch(
setQuery({
duration,
})
);
updateLocationUrl();
},
};
export default locationService;