mirror of
https://github.com/usememos/memos.git
synced 2025-03-25 23:20:12 +01:00
parent
677750ef51
commit
fae0b64a08
@ -4,6 +4,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"net/url"
|
||||||
"regexp"
|
"regexp"
|
||||||
"sort"
|
"sort"
|
||||||
|
|
||||||
@ -133,8 +134,10 @@ func (s *Server) registerTagRoutes(g *echo.Group) {
|
|||||||
return echo.NewHTTPError(http.StatusUnauthorized, "Missing user in session")
|
return echo.NewHTTPError(http.StatusUnauthorized, "Missing user in session")
|
||||||
}
|
}
|
||||||
|
|
||||||
tagName := c.Param("tagName")
|
tagName, err := url.QueryUnescape(c.Param("tagName"))
|
||||||
if tagName == "" {
|
if err != nil {
|
||||||
|
return echo.NewHTTPError(http.StatusBadRequest, "Invalid tag name").SetInternal(err)
|
||||||
|
} else if tagName == "" {
|
||||||
return echo.NewHTTPError(http.StatusBadRequest, "Tag name cannot be empty")
|
return echo.NewHTTPError(http.StatusBadRequest, "Tag name cannot be empty")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
import { getResourceUrl } from "../utils/resource";
|
||||||
import Icon from "./Icon";
|
import Icon from "./Icon";
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
@ -7,7 +8,7 @@ interface Props {
|
|||||||
|
|
||||||
const MemoResource: React.FC<Props> = (props: Props) => {
|
const MemoResource: React.FC<Props> = (props: Props) => {
|
||||||
const { className, resource } = props;
|
const { className, resource } = props;
|
||||||
const resourceUrl = `${window.location.origin}/o/r/${resource.id}/${resource.filename}`;
|
const resourceUrl = getResourceUrl(resource);
|
||||||
|
|
||||||
const handlePreviewBtnClick = () => {
|
const handlePreviewBtnClick = () => {
|
||||||
window.open(resourceUrl);
|
window.open(resourceUrl);
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import { absolutifyLink } from "../helpers/utils";
|
import { absolutifyLink } from "../helpers/utils";
|
||||||
|
import { getResourceUrl } from "../utils/resource";
|
||||||
import SquareDiv from "./common/SquareDiv";
|
import SquareDiv from "./common/SquareDiv";
|
||||||
import showPreviewImageDialog from "./PreviewImageDialog";
|
import showPreviewImageDialog from "./PreviewImageDialog";
|
||||||
import MemoResource from "./MemoResource";
|
import MemoResource from "./MemoResource";
|
||||||
@ -27,7 +28,7 @@ const MemoResources: React.FC<Props> = (props: Props) => {
|
|||||||
const imgUrls = availableResourceList
|
const imgUrls = availableResourceList
|
||||||
.filter((resource) => resource.type.startsWith("image"))
|
.filter((resource) => resource.type.startsWith("image"))
|
||||||
.map((resource) => {
|
.map((resource) => {
|
||||||
return `/o/r/${resource.id}/${resource.filename}`;
|
return getResourceUrl(resource);
|
||||||
});
|
});
|
||||||
|
|
||||||
const handleImageClick = (imgUrl: string) => {
|
const handleImageClick = (imgUrl: string) => {
|
||||||
@ -41,7 +42,7 @@ const MemoResources: React.FC<Props> = (props: Props) => {
|
|||||||
{availableResourceList.length > 0 && (
|
{availableResourceList.length > 0 && (
|
||||||
<div className="images-wrapper">
|
<div className="images-wrapper">
|
||||||
{availableResourceList.map((resource) => {
|
{availableResourceList.map((resource) => {
|
||||||
const url = `/o/r/${resource.id}/${resource.filename}`;
|
const url = getResourceUrl(resource);
|
||||||
if (resource.type.startsWith("image")) {
|
if (resource.type.startsWith("image")) {
|
||||||
return (
|
return (
|
||||||
<SquareDiv key={resource.id} className="memo-resource">
|
<SquareDiv key={resource.id} className="memo-resource">
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
import { Tooltip } from "@mui/joy";
|
import { Tooltip } from "@mui/joy";
|
||||||
import copy from "copy-to-clipboard";
|
import copy from "copy-to-clipboard";
|
||||||
import { useCallback, useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import useLoading from "../hooks/useLoading";
|
import useLoading from "../hooks/useLoading";
|
||||||
import { useResourceStore } from "../store/module";
|
import { useResourceStore } from "../store/module";
|
||||||
|
import { getResourceUrl } from "../utils/resource";
|
||||||
import Icon from "./Icon";
|
import Icon from "./Icon";
|
||||||
import toastHelper from "./Toast";
|
import toastHelper from "./Toast";
|
||||||
import Dropdown from "./common/Dropdown";
|
import Dropdown from "./common/Dropdown";
|
||||||
@ -83,10 +84,6 @@ const ResourcesDialog: React.FC<Props> = (props: Props) => {
|
|||||||
inputEl.click();
|
inputEl.click();
|
||||||
};
|
};
|
||||||
|
|
||||||
const getResourceUrl = useCallback((resource: Resource) => {
|
|
||||||
return `${window.location.origin}/o/r/${resource.id}/${resource.filename}`;
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
const handlePreviewBtnClick = (resource: Resource) => {
|
const handlePreviewBtnClick = (resource: Resource) => {
|
||||||
const resourceUrl = getResourceUrl(resource);
|
const resourceUrl = getResourceUrl(resource);
|
||||||
if (resource.type.startsWith("image")) {
|
if (resource.type.startsWith("image")) {
|
||||||
@ -104,7 +101,8 @@ const ResourcesDialog: React.FC<Props> = (props: Props) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const handleCopyResourceLinkBtnClick = (resource: Resource) => {
|
const handleCopyResourceLinkBtnClick = (resource: Resource) => {
|
||||||
copy(`${window.location.origin}/o/r/${resource.id}/${resource.filename}`);
|
const url = getResourceUrl(resource);
|
||||||
|
copy(url);
|
||||||
toastHelper.success(t("message.succeed-copy-resource-link"));
|
toastHelper.success(t("message.succeed-copy-resource-link"));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
import { Checkbox, Tooltip } from "@mui/joy";
|
import { Checkbox, Tooltip } from "@mui/joy";
|
||||||
import { useCallback, useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import useLoading from "../hooks/useLoading";
|
import useLoading from "../hooks/useLoading";
|
||||||
import { useEditorStore, useResourceStore } from "../store/module";
|
import { useEditorStore, useResourceStore } from "../store/module";
|
||||||
|
import { getResourceUrl } from "../utils/resource";
|
||||||
import Icon from "./Icon";
|
import Icon from "./Icon";
|
||||||
import toastHelper from "./Toast";
|
import toastHelper from "./Toast";
|
||||||
import { generateDialog } from "./Dialog";
|
import { generateDialog } from "./Dialog";
|
||||||
@ -47,10 +48,6 @@ const ResourcesSelectorDialog: React.FC<Props> = (props: Props) => {
|
|||||||
});
|
});
|
||||||
}, [resources]);
|
}, [resources]);
|
||||||
|
|
||||||
const getResourceUrl = useCallback((resource: Resource) => {
|
|
||||||
return `${window.location.origin}/o/r/${resource.id}/${resource.filename}`;
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
const handlePreviewBtnClick = (resource: Resource) => {
|
const handlePreviewBtnClick = (resource: Resource) => {
|
||||||
const resourceUrl = getResourceUrl(resource);
|
const resourceUrl = getResourceUrl(resource);
|
||||||
if (resource.type.startsWith("image")) {
|
if (resource.type.startsWith("image")) {
|
||||||
|
@ -198,7 +198,7 @@ export function upsertTag(tagName: string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function deleteTag(tagName: string) {
|
export function deleteTag(tagName: string) {
|
||||||
return axios.delete<ResponseObject<string>>(`/api/tag/${tagName}`);
|
return axios.delete<ResponseObject<string>>(`/api/tag/${encodeURI(tagName)}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function getRepoStarCount() {
|
export async function getRepoStarCount() {
|
||||||
|
3
web/src/utils/resource.ts
Normal file
3
web/src/utils/resource.ts
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
export const getResourceUrl = (resource: Resource, withOrigin = true) => {
|
||||||
|
return `${withOrigin ? window.location.origin : ""}/o/r/${resource.id}/${encodeURI(resource.filename)}`;
|
||||||
|
};
|
Loading…
x
Reference in New Issue
Block a user