Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: zoom buttons #1333

Merged
merged 32 commits into from
Jul 9, 2024
Merged
Show file tree
Hide file tree
Changes from 23 commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
8f798c8
feat: slider component
afonsojramos Jun 28, 2024
131b622
feat: zoom slider
afonsojramos Jun 28, 2024
0f2421c
chore: add mocks
afonsojramos Jun 28, 2024
ba6ab8d
chore: add tests
afonsojramos Jun 28, 2024
55b3e1a
Merge branch 'main' into feat/zoom-slider
afonsojramos Jul 1, 2024
78c7e71
Merge branch 'main' into feat/zoom-slider
afonsojramos Jul 1, 2024
a4bf556
fix: consistent ui
afonsojramos Jul 1, 2024
7a6aa86
chore: revert electron mock
afonsojramos Jul 1, 2024
b0b36cd
fix: consistent test output
afonsojramos Jul 1, 2024
aa78899
feat: add `%` & alignment
afonsojramos Jul 1, 2024
8afd848
feat: add live zoom in settings page
afonsojramos Jul 1, 2024
bb00f1a
feat: implemented multiplier
afonsojramos Jul 1, 2024
c86e7fd
chore: set multiplier to `2` and max zoom to 120%
afonsojramos Jul 1, 2024
6f58d45
Merge branch 'main' into feat/zoom-slider
afonsojramos Jul 2, 2024
b230c08
refactor: update slider component
afonsojramos Jul 2, 2024
ef1b1ad
chore: define default step ammount
afonsojramos Jul 2, 2024
7e60474
refactor: button component
afonsojramos Jul 5, 2024
b0cf36d
chore: undo zoom specific changes
afonsojramos Jul 5, 2024
93d3a89
Merge branch 'main' into feat/zoom-slider
afonsojramos Jul 5, 2024
6664dd0
fix: button in light mode
afonsojramos Jul 5, 2024
edd6642
feat: zoom buttons
afonsojramos Jul 5, 2024
1228182
Merge branch 'main' into feat/zoom-buttons
afonsojramos Jul 7, 2024
ac28071
Merge branch 'main' into feat/zoom-buttons
afonsojramos Jul 8, 2024
4bc16b3
feat: zoom buttons
afonsojramos Jul 8, 2024
3a51451
feat: saving zoom to settings
afonsojramos Jul 8, 2024
a3ab530
Merge branch 'main' into feat/zoom-buttons
afonsojramos Jul 8, 2024
8f8d717
fix: loading zoomPercentage settings
afonsojramos Jul 8, 2024
7e3098b
Merge branches 'feat/zoom-buttons' and 'feat/zoom-buttons' of github.…
afonsojramos Jul 8, 2024
0794b3c
fix: set zoom level from defaultSettings if no Zoom Percentage set
afonsojramos Jul 9, 2024
50c60d5
chore: add default behaviour to handle edge cases
afonsojramos Jul 9, 2024
eab5a6e
fix: snapshot
afonsojramos Jul 9, 2024
45d2a3a
Merge branch 'main' into feat/zoom-buttons
afonsojramos Jul 9, 2024
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
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,8 @@
"nock": "13.5.4",
"postcss": "8.4.39",
"postcss-loader": "8.1.1",
"rimraf": "5.0.8",
"resize-observer-polyfill": "1.5.1",
"rimraf": "5.0.7",
"style-loader": "4.0.0",
"tailwindcss": "3.4.4",
"ts-jest": "29.1.5",
Expand Down
8 changes: 8 additions & 0 deletions pnpm-lock.yaml

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

4 changes: 4 additions & 0 deletions src/__mocks__/electron.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,8 @@ module.exports = {
shell: {
openExternal: jest.fn(),
},
webFrame: {
setZoomLevel: jest.fn(),
getZoomLevel: jest.fn(),
},
};
2 changes: 2 additions & 0 deletions src/components/settings/AppearanceSettings.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import { mockAuth, mockSettings } from '../../__mocks__/state-mocks';
import { AppContext } from '../../context/App';
import { AppearanceSettings } from './AppearanceSettings';

global.ResizeObserver = require('resize-observer-polyfill');

describe('routes/components/AppearanceSettings.tsx', () => {
const updateSetting = jest.fn();

Expand Down
55 changes: 53 additions & 2 deletions src/components/settings/AppearanceSettings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,21 @@ import {
MilestoneIcon,
TagIcon,
} from '@primer/octicons-react';
import { ipcRenderer } from 'electron';
import { type FC, useContext, useEffect } from 'react';
import { ipcRenderer, webFrame } from 'electron';
import { type FC, useContext, useEffect, useState } from 'react';
import { AppContext } from '../../context/App';
import { Size, Theme } from '../../types';
import { setTheme } from '../../utils/theme';
import { percentageToZoom, zoomToPercentage } from '../../utils/zoom';
import { Button } from '../buttons/Button';
import { Checkbox } from '../fields/Checkbox';
import { RadioGroup } from '../fields/RadioGroup';

export const AppearanceSettings: FC = () => {
const { settings, updateSetting } = useContext(AppContext);
afonsojramos marked this conversation as resolved.
Show resolved Hide resolved
const [zoomLevel, setZoomLevel] = useState(
zoomToPercentage(webFrame.getZoomLevel()),
);

useEffect(() => {
ipcRenderer.on('gitify:update-theme', (_, updatedTheme: Theme) => {
Expand All @@ -24,6 +29,10 @@ export const AppearanceSettings: FC = () => {
});
}, [settings.theme]);

window.addEventListener('resize', () => {
setZoomLevel(zoomToPercentage(webFrame.getZoomLevel()));
});

return (
<fieldset>
<legend id="appearance" className="mb-1 mt-2 font-semibold">
Expand All @@ -43,6 +52,48 @@ export const AppearanceSettings: FC = () => {
}}
className="mb-0"
/>
<div className="flex">
<label
htmlFor="Zoom"
className="mr-3 content-center font-medium text-sm text-gray-700 dark:text-gray-200"
>
Zoom:
</label>
<Button
label="Zoom Out"
onClick={() =>
zoomLevel > 0 &&
webFrame.setZoomLevel(percentageToZoom(zoomLevel - 10))
}
className="rounded-r-none"
size="sm"
>
-
</Button>
<span className="flex w-16 items-center justify-center rounded-none border border-gray-300 bg-transparent text-sm text-gray-700 dark:text-gray-200">
{zoomLevel.toFixed(0)}%
</span>
<Button
label="Zoom In"
onClick={() =>
zoomLevel < 120 &&
webFrame.setZoomLevel(percentageToZoom(zoomLevel + 10))
}
className="rounded-none"
size="sm"
>
+
</Button>
<Button
label="Reset"
onClick={() => webFrame.setZoomLevel(0)}
variant="destructive"
className="rounded-l-none"
size="sm"
>
X
</Button>
</div>
<Checkbox
name="detailedNotifications"
label="Detailed notifications"
Expand Down
2 changes: 2 additions & 0 deletions src/components/settings/SettingsFooter.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ jest.mock('react-router-dom', () => ({
useNavigate: () => mockNavigate,
}));

global.ResizeObserver = require('resize-observer-polyfill');

describe('routes/components/SettingsFooter.tsx', () => {
afterEach(() => {
jest.clearAllMocks();
Expand Down
2 changes: 2 additions & 0 deletions src/routes/Settings.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import { mockPlatform } from '../__mocks__/utils';
import { AppContext } from '../context/App';
import { SettingsRoute } from './Settings';

global.ResizeObserver = require('resize-observer-polyfill');

const mockNavigate = jest.fn();
jest.mock('react-router-dom', () => ({
...jest.requireActual('react-router-dom'),
Expand Down

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

34 changes: 34 additions & 0 deletions src/routes/__snapshots__/Settings.test.tsx.snap

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

17 changes: 17 additions & 0 deletions src/utils/zoom.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { percentageToZoom, zoomToPercentage } from './zoom';

describe('utils/zoom.ts', () => {
it('should convert percentage to zoom level', () => {
expect(percentageToZoom(100)).toBe(0);
expect(percentageToZoom(50)).toBe(-1);
expect(percentageToZoom(0)).toBe(-2);
expect(percentageToZoom(150)).toBe(1);
});

it('should convert zoom level to percentage', () => {
expect(zoomToPercentage(0)).toBe(100);
expect(zoomToPercentage(-1)).toBe(50);
expect(zoomToPercentage(-2)).toBe(0);
expect(zoomToPercentage(1)).toBe(150);
});
});
15 changes: 15 additions & 0 deletions src/utils/zoom.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
const RECOMMENDED = 100;
const MULTIPLIER = 2;

/**
* Percentage to zoom level. 100% is the recommended zoom level (0).
* @param percentage 0-150
* @returns zoomLevel -2 to 0.5
*/
export const percentageToZoom = (percentage: number): number => {
return ((percentage - RECOMMENDED) * MULTIPLIER) / 100;
};

export const zoomToPercentage = (zoom: number): number => {
return (zoom / MULTIPLIER) * 100 + RECOMMENDED;
};
Loading