Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/cold-dolls-look.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"headertweaker": patch
---

Bugfixes
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
"@heroicons/react": "2.2.0",
"clsx": "2.1.1",
"react": "18.2.0",
"react-compiler-runtime": "^1.0.0",
"react-dom": "18.2.0",
"uuid": "11.1.0"
},
Expand All @@ -32,6 +33,7 @@
"@types/react": "19.1.12",
"@types/react-dom": "19.1.9",
"@vitejs/plugin-react": "5.0.2",
"babel-plugin-react-compiler": "^1.0.0",
"husky": "9.1.7",
"rimraf": "6.0.1",
"sass": "1.70.0",
Expand Down
22 changes: 22 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 9 additions & 3 deletions src/background.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
import { getStatus } from '@helpers/headertweaker.helper';

const isFirefox = typeof browser !== 'undefined';
const webRequest = isFirefox ? browser.webRequest : chrome.webRequest;
const storage = isFirefox ? browser.storage : chrome.storage;

// Keep in sync with STATUS_KEY in headertweaker.helper.ts
const STATUS_KEY = 'isDisabled';

const getStatus = async (): Promise<'enabled' | 'disabled'> => {
const result = await storage.local.get(STATUS_KEY);
return result[STATUS_KEY] ? 'disabled' : 'enabled';
};

type Header = { name: string; value: string; enabled: boolean };

Expand All @@ -12,7 +19,6 @@ type OnBeforeSendHeadersDetails<T> = T extends typeof browser.webRequest
: never;

const getHeaders = async (): Promise<Header[]> => {
const storage = typeof browser !== 'undefined' ? browser.storage : chrome.storage;
const result = await storage.local.get('headers');
return result.headers || [];
};
Expand Down
10 changes: 5 additions & 5 deletions src/components/app/app-footer.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { type ChangeEvent, useCallback, useEffect, useState } from 'react';
import { type ChangeEvent, useEffect, useState } from 'react';
import { Button } from '@components/button/button';
import { Input } from '@components/input/input';
import { useHeaderTweakerContext } from '@contexts/headertweaker.context';
Expand All @@ -13,7 +13,7 @@ export const AppFooter = () => {
const [disabledButton, setDisabledButton] = useState(true);
const { isDisabled, updateHeader } = useHeaderTweakerContext();

const handleInputChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {
const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {
const { target } = e;

setHeader((prev) => {
Expand All @@ -23,9 +23,9 @@ export const AppFooter = () => {
target.getAttribute('data-type') === 'value' ? target.value : prev?.value || '';
return { id: '', name: headerKey, value: headerValue, enabled: false };
});
}, []);
};

const validateHeaderKey = useCallback(() => {
const validateHeaderKey = () => {
const headerKey = cleanupHeaderKey(header?.name || '');

setHeader((prev) => ({
Expand All @@ -35,7 +35,7 @@ export const AppFooter = () => {
value: prev?.value ?? '',
enabled: false,
}));
}, [header?.name]);
};

useEffect(
() => setDisabledButton(!(header?.name && header?.value)),
Expand Down
42 changes: 20 additions & 22 deletions src/components/button/button.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { type ComponentProps, memo, type ReactNode } from 'react';
import type { ComponentProps, ReactNode } from 'react';
import classnames from 'clsx';

import css from './button.module.scss';
Expand All @@ -8,24 +8,22 @@ export interface ButtonProps extends ComponentProps<'button'> {
variant?: 'default' | 'ghost';
}

export const Button = memo(
({
children,
className,
'aria-label': ariaLabel,
variant = 'default',
...props
}: ButtonProps) => {
return (
<button
className={classnames(css.root, className, {
[css.ghost]: variant === 'ghost',
})}
aria-label={ariaLabel}
{...props}
>
{children}
</button>
);
}
);
export const Button = ({
children,
className,
'aria-label': ariaLabel,
variant = 'default',
...props
}: ButtonProps) => {
return (
<button
className={classnames(css.root, className, {
[css.ghost]: variant === 'ghost',
})}
aria-label={ariaLabel}
{...props}
>
{children}
</button>
);
};
4 changes: 2 additions & 2 deletions src/components/button/icon-button.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { cloneElement, type ElementType, isValidElement, memo, type ReactElement } from 'react';
import { cloneElement, type ElementType, isValidElement, type ReactElement } from 'react';
import classnames from 'clsx';
import { Button, type ButtonProps } from './button';

Expand Down Expand Up @@ -47,4 +47,4 @@ const IconButtonComponent = <
);
};

export const IconButton = memo(IconButtonComponent);
export const IconButton = IconButtonComponent;
5 changes: 2 additions & 3 deletions src/components/drawer/drawer.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { memo } from 'react';
import { ModalTitle } from '@components/modal/ModalTitle';
import { Modal, type ModalProps } from '@components/modal/modal';
import { ModalClose } from '@components/modal/modal-close';
Expand All @@ -8,12 +7,12 @@ interface DrawerProps extends Omit<ModalProps, 'type'> {
title: string;
}

export const Drawer = memo(({ title, children, ...props }: DrawerProps) => {
export const Drawer = ({ title, children, ...props }: DrawerProps) => {
return (
<Modal type="drawer" {...props}>
<ModalTitle>{title}</ModalTitle>
<ModalClose onClose={props.onClose} />
<ModalContent>{children}</ModalContent>
</Modal>
);
});
};
10 changes: 5 additions & 5 deletions src/components/edit-header/edit-header.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { type ChangeEvent, useCallback, useState } from 'react';
import { type ChangeEvent, useState } from 'react';
import { Button } from '@components/button/button';
import { Input } from '@components/input/input';
import { Switch } from '@components/switch/switch';
Expand All @@ -18,7 +18,7 @@ export const EditHeader = ({ closePanel }: EditHeaderProps) => {
const { updateHeader, selectedHeader } = useHeaderTweakerContext();
const [header, setHeader] = useState<Header | null>(selectedHeader);

const handleInputChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {
const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {
const { target } = e;

setHeader((prev) => {
Expand All @@ -33,9 +33,9 @@ export const EditHeader = ({ closePanel }: EditHeaderProps) => {
enabled: prev?.enabled ?? false,
};
});
}, []);
};

const validateHeaderKey = useCallback(() => {
const validateHeaderKey = () => {
const headerKey = cleanupHeaderKey(header?.name || '');

setHeader((prev) => ({
Expand All @@ -45,7 +45,7 @@ export const EditHeader = ({ closePanel }: EditHeaderProps) => {
value: prev?.value ?? '',
enabled: prev?.enabled ?? false,
}));
}, [header?.name]);
};

if (!header) return null;

Expand Down
45 changes: 21 additions & 24 deletions src/components/feedback/confirm.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { memo } from 'react';
import { Button } from '@components/button/button';
import { ButtonGroup } from '@components/button/button-group';
import { ModalTitle } from '@components/modal/ModalTitle';
Expand All @@ -7,27 +6,25 @@ import { ModalContent } from '@components/modal/modal-content';
import { ModalFooter } from '@components/modal/modal-footer';
import type { ConfirmProps } from './interfaces';

export const Confirm = memo(
({
message,
onConfirm,
onCancel,
title,
confirmText = 'OK',
cancelText = 'Cancel',
...modalProps
}: ConfirmProps) => (
<Modal type="confirm" {...modalProps}>
<ModalTitle>{title}</ModalTitle>
<ModalContent>{message}</ModalContent>
<ModalFooter>
<ButtonGroup>
<Button onClick={onConfirm}>{confirmText}</Button>
<Button variant="ghost" onClick={onCancel}>
{cancelText}
</Button>
</ButtonGroup>
</ModalFooter>
</Modal>
)
export const Confirm = ({
message,
onConfirm,
onCancel,
title,
confirmText = 'OK',
cancelText = 'Cancel',
...modalProps
}: ConfirmProps) => (
<Modal type="confirm" {...modalProps}>
<ModalTitle>{title}</ModalTitle>
<ModalContent>{message}</ModalContent>
<ModalFooter>
<ButtonGroup>
<Button onClick={onConfirm}>{confirmText}</Button>
<Button variant="ghost" onClick={onCancel}>
{cancelText}
</Button>
</ButtonGroup>
</ModalFooter>
</Modal>
);
34 changes: 18 additions & 16 deletions src/components/feedback/success.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { memo } from 'react';
import { Button } from '@components/button/button';
import { ButtonGroup } from '@components/button/button-group';
import { ModalTitle } from '@components/modal/ModalTitle';
Expand All @@ -9,19 +8,22 @@ import { ModalFooter } from '@components/modal/modal-footer';
import { CheckCircleIcon } from '@heroicons/react/24/solid';
import type { SuccessProps } from './interfaces';

export const Success = memo(
({ message, onConfirm, confirmText = 'OK', ...modalProps }: SuccessProps) => (
<Modal type="success" {...modalProps}>
<ModalIcon>
<CheckCircleIcon />
</ModalIcon>
<ModalTitle>Success</ModalTitle>
<ModalContent>{message}</ModalContent>
<ModalFooter>
<ButtonGroup>
<Button onClick={onConfirm}>{confirmText}</Button>
</ButtonGroup>
</ModalFooter>
</Modal>
)
export const Success = ({
message,
onConfirm,
confirmText = 'OK',
...modalProps
}: SuccessProps) => (
<Modal type="success" {...modalProps}>
<ModalIcon>
<CheckCircleIcon />
</ModalIcon>
<ModalTitle>Success</ModalTitle>
<ModalContent>{message}</ModalContent>
<ModalFooter>
<ButtonGroup>
<Button onClick={onConfirm}>{confirmText}</Button>
</ButtonGroup>
</ModalFooter>
</Modal>
);
7 changes: 3 additions & 4 deletions src/components/header-content/header-content.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { useCallback } from 'react';
import { Text } from '@components/text/text';
import { Tooltip } from '@components/tooltip/tooltip';
import { TooltipContent } from '@components/tooltip/tooltip-content';
Expand All @@ -11,10 +10,10 @@ interface HeaderContentProps {
}

export const HeaderContent = ({ content }: HeaderContentProps) => {
const onClick = useCallback(async () => {
const onClick = async () => {
const clipboardItem = new ClipboardItem({ 'text/plain': content });
await navigator.clipboard.write([clipboardItem]);
}, [content]);
};

return (
<Tooltip>
Expand All @@ -26,7 +25,7 @@ export const HeaderContent = ({ content }: HeaderContentProps) => {

<TooltipContent>
<Text>{content}</Text>
<Text variant="small">(Click to copy to clipboard)</Text>
<Text variant="body-small">(Click to copy to clipboard)</Text>
</TooltipContent>
</Tooltip>
);
Expand Down
Loading
Loading