diff --git a/webview-ui/.eslintrc.json b/webview-ui/.eslintrc.json
new file mode 100644
index 0000000..0c69367
--- /dev/null
+++ b/webview-ui/.eslintrc.json
@@ -0,0 +1,40 @@
+{
+ "root": true,
+ "extends": [
+ "eslint:recommended",
+ "plugin:react/recommended",
+ "plugin:@typescript-eslint/recommended",
+ "plugin:react-hooks/recommended"
+ ],
+ "parser": "@typescript-eslint/parser",
+ "plugins": ["react", "@typescript-eslint", "react-hooks"],
+ "rules": {
+ "react/react-in-jsx-scope": "off",
+ "@typescript-eslint/explicit-module-boundary-types": "off",
+ "@typescript-eslint/no-explicit-any": "warn",
+ "react/display-name": "warn",
+ "no-case-declarations": "warn",
+ "react/no-unescaped-entities": "warn",
+ "react/jsx-key": "warn",
+ "no-extra-semi": "warn",
+ "@typescript-eslint/no-var-requires": "warn",
+ "@typescript-eslint/no-unused-vars": [
+ "warn",
+ {
+ "argsIgnorePattern": "^_",
+ "varsIgnorePattern": "^_",
+ "caughtErrorsIgnorePattern": "^_"
+ }
+ ]
+ },
+ "settings": {
+ "react": {
+ "version": "detect"
+ }
+ },
+ "env": {
+ "browser": true,
+ "es2021": true,
+ "node": true
+ }
+}
diff --git a/webview-ui/src/components/chat/ChatRow.tsx b/webview-ui/src/components/chat/ChatRow.tsx
index ffa340e..1ec109f 100644
--- a/webview-ui/src/components/chat/ChatRow.tsx
+++ b/webview-ui/src/components/chat/ChatRow.tsx
@@ -89,7 +89,7 @@ export const ChatRowContent = ({
}
}, [isLast, message.say])
const [cost, apiReqCancelReason, apiReqStreamingFailedMessage] = useMemo(() => {
- if (message.text && message.say === "api_req_started") {
+ if (message.text != null && message.say === "api_req_started") {
const info: ClineApiReqInfo = JSON.parse(message.text)
return [info.cost, info.cancelReason, info.streamingFailedMessage]
}
@@ -183,26 +183,26 @@ export const ChatRowContent = ({
)
return [
- apiReqCancelReason !== null ? (
+ apiReqCancelReason != null ? (
apiReqCancelReason === "user_cancelled" ? (
getIconSpan("error", cancelledColor)
) : (
getIconSpan("error", errorColor)
)
- ) : cost !== null ? (
+ ) : cost != null ? (
getIconSpan("check", successColor)
) : apiRequestFailedMessage ? (
getIconSpan("error", errorColor)
) : (
{apiRequestFailedMessage || apiReqStreamingFailedMessage}
diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx
index 3f58c7a..519b7e5 100644
--- a/webview-ui/src/components/chat/ChatView.tsx
+++ b/webview-ui/src/components/chat/ChatView.tsx
@@ -275,7 +275,7 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie
return true
} else {
const lastApiReqStarted = findLast(modifiedMessages, (message) => message.say === "api_req_started")
- if (lastApiReqStarted && lastApiReqStarted.text && lastApiReqStarted.say === "api_req_started") {
+ if (lastApiReqStarted && lastApiReqStarted.text != null && lastApiReqStarted.say === "api_req_started") {
const cost = JSON.parse(lastApiReqStarted.text).cost
if (cost === undefined) {
// api request has not finished yet
@@ -718,9 +718,9 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie
if (message.say === "api_req_started") {
// get last api_req_started in currentGroup to check if it's cancelled. If it is then this api req is not part of the current browser session
const lastApiReqStarted = [...currentGroup].reverse().find((m) => m.say === "api_req_started")
- if (lastApiReqStarted?.text) {
+ if (lastApiReqStarted?.text != null) {
const info = JSON.parse(lastApiReqStarted.text)
- const isCancelled = info.cancelReason !== null
+ const isCancelled = info.cancelReason != null
if (isCancelled) {
endBrowserSession()
result.push(message)
diff --git a/webview-ui/src/components/welcome/WelcomeView.tsx b/webview-ui/src/components/welcome/WelcomeView.tsx
index d72d856..3e3bbd7 100644
--- a/webview-ui/src/components/welcome/WelcomeView.tsx
+++ b/webview-ui/src/components/welcome/WelcomeView.tsx
@@ -10,7 +10,7 @@ const WelcomeView = () => {
const [apiErrorMessage, setApiErrorMessage] = useState