Apps Script用Sheet生成動態網頁(24): 移植刪除HTML連結功能
一週又過去了,我們本週將許多之前實作的功能都移植到React上了,程式碼的份量佔比也很高,所以今天就簡單的移植上一篇中的未實施的刪除連結功能。
從下週開始便會使用React的hook處理會員登入後才能使用的功能。
1. Apps Script的部份(後端/伺服端)
支援刪除功能後端的API只要新增一個deleteContentFromSheet(),基本判斷都沿用
src/server/content.js
export function deleteContentByName(name) {
User.validateUploadPermission();
const sheet = getContentSheet();
const rowIdx = findIndexInColumn(name, COLUMN_IDX_OF_NAME, sheet);
if (rowIdx > 0) sheet.deleteRow(1 + rowIdx);
return { deleted: rowIdx >= 0 };
}
src/server/index.js
global.deleteContentFromSheet = contentFunctions.deleteContentByName;
2. React的部份(前端/使用者端)
- 用useEffect(...,[])在頁面載入時,取得會員登入的token,跟後端確認是否有權限可以顯示刪除按鈕。這裡是只要會員登入就會顯示刪除按鈕,未來會再改成實際判斷權限的API來處理。
- 新增一個按鈕事件處理deleteLink(),會取用button的name屬性作為刪除名稱跟後端溝通。
src/client/demo-bootstrap/pages/LinkLister.jsx
import React, { useEffect, useState } from 'react';
import { Container, Button } from 'react-bootstrap';
import Server from '../../utils/server';
const { serverFunctions } = Server;
const LinkLister = () => {
const [linkList, setlinkList] = useState(null);
const [showDelete, hasDeletePermission] = useState(false);
useEffect(() => {
serverFunctions
.getLinkList()
.then(setlinkList)
.catch(alert);
const token = localStorage.getItem('user-token');
serverFunctions.authLogin(token).then(() => hasDeletePermission(true));
}, []);
const deleteLink = event => {
event.preventDefault();
const { name } = event.target;
const element = event.target;
serverFunctions.deleteContentFromSheet(name).then(response => {
if (response.deleted && element) element.parentNode.remove();
});
};
return (
<Container>
<h1>Sheet儲存的網頁</h1>
{linkList && (
<ul>
{linkList.map((link, idx) => (
<li key={idx}>
<a href={link.url}>{link.name}</a>
{showDelete && (
<Button
variant="outline-danger"
size="sm"
onClick={deleteLink}
name={link.name}
>
刪除
</Button>
)}
</li>
))}
</ul>
)}
</Container>
);
};
export default LinkLister;
留言