Compare commits
10 Commits
fix/vite-h
...
sgunter/fe
| Author | SHA1 | Date | |
|---|---|---|---|
| bb4fbc3700 | |||
|
|
e8a8b8e1ae | ||
|
|
c21cbd77f0 | ||
| 99a035e29d | |||
|
|
64baa6d290 | ||
|
|
35d903e7c8 | ||
|
|
1fffb3c2e7 | ||
|
|
4590a74896 | ||
| 190d1db2fa | |||
|
|
b8a44b45b8 |
18
CHANGELOG.md
18
CHANGELOG.md
@@ -1,9 +1,27 @@
|
||||
## [2.2.2](https://github.com/Longhorn-Developers/UT-Registration-Plus/compare/v2.2.1...v2.2.2) (2025-10-13)
|
||||
|
||||
### Features
|
||||
|
||||
* add nix flake ([#593](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/593)) ([7b401ad](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/7b401add1565ff401bad99745ff9e53b9a7f899f))
|
||||
* automatically select new or duplicated schedules ([#583](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/583)) ([#589](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/589)) ([2a50f55](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/2a50f5580d3dbeb0d66546c23cf29bbb37d80da2))
|
||||
* **env:** add SENTRY env vars ([8f7e1bc](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/8f7e1bc0af6336549068e02b80df21d4e8f4ef9c))
|
||||
* export schedule button add to calendar ([#594](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/594)) ([5994ded](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/5994ded8be876cb55174d27d3fdb0832b21a0ff9))
|
||||
* search result shading ([#617](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/617)) ([be861b8](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/be861b823cb2cb7f6f4a1f266351eec3fc1c2f99))
|
||||
* show warning for courses of different semesters ([#570](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/570)) ([2e7dac1](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/2e7dac1e3eba757231ac07ac966231c08c703a16))
|
||||
* support summer grades, fix summer course parser ([#596](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/596)) ([2d92dd4](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/2d92dd47f00a44b7d48e92a8ffba94480e4e73f9))
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* fix or ignore various eslint warning ([#609](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/609)) ([95de8df](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/95de8df37243b6d59625df515a60442f11b7a9d3))
|
||||
* limit height of schedule list dropdown in the extension popup ([#543](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/543)) ([eb8141e](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/eb8141ee8c3d32bce901457178d50781b78f86dd))
|
||||
* whitespace wrapping in semester warning ([#629](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/629)) ([46fe591](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/46fe591fa72ef017eea7cfb8aa37d12d8f223926))
|
||||
## [2.2.1](https://github.com/Longhorn-Developers/UT-Registration-Plus/compare/v2.2.0...v2.2.1) (2025-06-04)
|
||||
|
||||
### Features
|
||||
|
||||
* add dining app promo ([#598](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/598)) ([be1dccf](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/be1dccfcb9d052c6b291b50cc53418d6bb645beb))
|
||||
* inside jokes005 ([#590](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/590)) ([37471ef](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/37471efb740c7a5828cf3b54bac70954694359d7))
|
||||
* **release:** v2.2.1 ([234f3d6](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/234f3d627d603adf8555b4d0e93106d198918169))
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
|
||||
6
flake.lock
generated
6
flake.lock
generated
@@ -20,11 +20,11 @@
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1754725699,
|
||||
"narHash": "sha256-iAcj9T/Y+3DBy2J0N+yF9XQQQ8IEb5swLFzs23CdP88=",
|
||||
"lastModified": 1759831965,
|
||||
"narHash": "sha256-vgPm2xjOmKdZ0xKA6yLXPJpjOtQPHfaZDRtH+47XEBo=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "85dbfc7aaf52ecb755f87e577ddbe6dbbdbc1054",
|
||||
"rev": "c9b6fb798541223bbb396d287d16f43520250518",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
||||
25
flake.nix
25
flake.nix
@@ -14,22 +14,29 @@
|
||||
system:
|
||||
let
|
||||
pkgs = (import nixpkgs { inherit system; });
|
||||
|
||||
commonPackages = with pkgs; [
|
||||
nodejs_20 # v20.19.5
|
||||
pnpm_10 # v10.18.0
|
||||
];
|
||||
|
||||
additionalPackages = with pkgs; [
|
||||
bun
|
||||
nodePackages.conventional-changelog-cli
|
||||
sentry-cli
|
||||
];
|
||||
in
|
||||
{
|
||||
formatter = pkgs.nixfmt-rfc-style;
|
||||
|
||||
devShells.default = pkgs.mkShell {
|
||||
name = "utrp-dev";
|
||||
buildInputs = with pkgs; [
|
||||
nodejs_20 # v20.19.4
|
||||
pnpm_10 # v10.14.0
|
||||
];
|
||||
buildInputs = commonPackages;
|
||||
};
|
||||
|
||||
shellHook = ''
|
||||
echo "UTRP Nix Flake Environment Loaded"
|
||||
echo "Node: $(node --version)"
|
||||
echo "pnpm: $(pnpm --version)"
|
||||
'';
|
||||
devShells.full = pkgs.mkShell {
|
||||
name = "utrp-dev-full";
|
||||
buildInputs = commonPackages ++ additionalPackages;
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "ut-registration-plus",
|
||||
"displayName": "UT Registration Plus",
|
||||
"version": "2.2.1",
|
||||
"version": "2.2.2",
|
||||
"description": "UT Registration Plus is a Chrome extension that allows students to easily register for classes.",
|
||||
"private": true,
|
||||
"homepage": "https://github.com/Longhorn-Developers/UT-Registration-Plus",
|
||||
@@ -144,7 +144,7 @@
|
||||
"unocss": "^0.63.6",
|
||||
"unocss-preset-primitives": "0.0.2-beta.1",
|
||||
"unplugin-icons": "^0.19.3",
|
||||
"vite": "^5.4.14",
|
||||
"vite": "^5.4.20",
|
||||
"vite-plugin-inspect": "^0.8.9",
|
||||
"vitest": "^2.1.9"
|
||||
},
|
||||
|
||||
935
pnpm-lock.yaml
generated
935
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@@ -1,3 +1,4 @@
|
||||
import ExtensionRoot from '@views/components/common/ExtensionRoot/ExtensionRoot';
|
||||
import ReportIssueMain from '@views/components/ReportIssueMain';
|
||||
import SentryProvider from '@views/contexts/SentryContext';
|
||||
import React from 'react';
|
||||
@@ -5,6 +6,8 @@ import { createRoot } from 'react-dom/client';
|
||||
|
||||
createRoot(document.getElementById('root')!).render(
|
||||
<SentryProvider fullInit>
|
||||
<ReportIssueMain />
|
||||
<ExtensionRoot>
|
||||
<ReportIssueMain />
|
||||
</ExtensionRoot>
|
||||
</SentryProvider>
|
||||
);
|
||||
|
||||
@@ -24,6 +24,12 @@ export interface IOptionsStore {
|
||||
|
||||
/** whether the promo should be shown */
|
||||
showUTDiningPromo: boolean;
|
||||
|
||||
/** whether the user's email address should be remembered by the extension */
|
||||
rememberMyEmail: boolean;
|
||||
|
||||
/** the user's email address, if set and chosen to be remembered */
|
||||
emailAddress: string;
|
||||
}
|
||||
|
||||
export const OptionsStore = createSyncStore<IOptionsStore>({
|
||||
@@ -34,6 +40,8 @@ export const OptionsStore = createSyncStore<IOptionsStore>({
|
||||
alwaysOpenCalendarInNewTab: false,
|
||||
showCalendarSidebar: true,
|
||||
showUTDiningPromo: true,
|
||||
rememberMyEmail: false,
|
||||
emailAddress: '',
|
||||
});
|
||||
|
||||
/**
|
||||
@@ -50,6 +58,8 @@ export const initSettings = async () =>
|
||||
alwaysOpenCalendarInNewTab: await OptionsStore.get('alwaysOpenCalendarInNewTab'),
|
||||
showCalendarSidebar: await OptionsStore.get('showCalendarSidebar'),
|
||||
showUTDiningPromo: await OptionsStore.get('showUTDiningPromo'),
|
||||
rememberMyEmail: await OptionsStore.get('rememberMyEmail'),
|
||||
emailAddress: await OptionsStore.get('emailAddress'),
|
||||
}) satisfies IOptionsStore;
|
||||
|
||||
// Clothing retailer right
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
import 'uno.css';
|
||||
|
||||
import { captureFeedback } from '@sentry/react';
|
||||
import { OptionsStore } from '@shared/storage/OptionsStore';
|
||||
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
||||
import React, { useState } from 'react';
|
||||
|
||||
import { Button } from './common/Button';
|
||||
@@ -12,19 +14,57 @@ import Text from './common/Text/Text';
|
||||
* @returns The rendered component.
|
||||
*/
|
||||
export default function ReportIssueMain(): JSX.Element {
|
||||
const [email, setEmail] = useState('');
|
||||
const queryClient = useQueryClient();
|
||||
|
||||
const { data: emailAddress } = useQuery({
|
||||
queryKey: ['settings', 'emailAddress'],
|
||||
queryFn: () => OptionsStore.get('emailAddress'),
|
||||
staleTime: Infinity, // Prevent loading state on refocus
|
||||
});
|
||||
|
||||
const { mutate: setEmailAddress } = useMutation({
|
||||
mutationKey: ['settings', 'emailAddress'],
|
||||
mutationFn: async ({ rememberMyEmail, emailAddress }: { rememberMyEmail: boolean; emailAddress: string }) => {
|
||||
queryClient.setQueryData(['settings', 'emailAddress'], emailAddress);
|
||||
if (rememberMyEmail) {
|
||||
OptionsStore.set('emailAddress', emailAddress);
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
const { data: rememberMyEmail } = useQuery({
|
||||
queryKey: ['settings', 'rememberMyEmail'],
|
||||
queryFn: () => OptionsStore.get('rememberMyEmail'),
|
||||
staleTime: Infinity, // Prevent loading state on refocus
|
||||
});
|
||||
|
||||
const { mutate: setRememberMyEmail } = useMutation({
|
||||
mutationKey: ['settings', 'rememberMyEmail'],
|
||||
mutationFn: async ({ rememberMyEmail, emailAddress }: { rememberMyEmail: boolean; emailAddress: string }) => {
|
||||
queryClient.setQueryData(['settings', 'rememberMyEmail'], rememberMyEmail);
|
||||
OptionsStore.set('rememberMyEmail', rememberMyEmail);
|
||||
|
||||
if (rememberMyEmail) {
|
||||
OptionsStore.set('emailAddress', emailAddress);
|
||||
} else {
|
||||
OptionsStore.set('emailAddress', '');
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
const [feedback, setFeedback] = useState('');
|
||||
const [isSubmitted, setIsSubmitted] = useState(false);
|
||||
|
||||
const submitFeedback = async () => {
|
||||
if (!email || !feedback) {
|
||||
if (!emailAddress || !feedback) {
|
||||
throw new Error('Email and feedback are required');
|
||||
}
|
||||
// Here you would typically send the feedback to a server
|
||||
await captureFeedback(
|
||||
|
||||
// Send the feedback to Sentry
|
||||
captureFeedback(
|
||||
{
|
||||
message: feedback || 'No feedback provided',
|
||||
email,
|
||||
email: emailAddress,
|
||||
tags: {
|
||||
version: chrome.runtime.getManifest().version,
|
||||
},
|
||||
@@ -34,16 +74,14 @@ export default function ReportIssueMain(): JSX.Element {
|
||||
}
|
||||
);
|
||||
|
||||
// Reset form fields and close the dialog
|
||||
setEmail('');
|
||||
setFeedback('');
|
||||
// Close the dialog
|
||||
setIsSubmitted(true);
|
||||
};
|
||||
|
||||
if (isSubmitted) {
|
||||
return (
|
||||
<div className='w-80 flex flex-col rounded-lg bg-white p-6 shadow-lg'>
|
||||
<Text variant='h2' className='mb-4'>
|
||||
<div className='w-92 flex flex-col rounded-lg bg-white p-6 shadow-lg'>
|
||||
<Text variant='h2' className='my-4'>
|
||||
Thank you
|
||||
</Text>
|
||||
<Text variant='p' className='mb-6'>
|
||||
@@ -56,28 +94,13 @@ export default function ReportIssueMain(): JSX.Element {
|
||||
);
|
||||
}
|
||||
|
||||
if (isSubmitted) {
|
||||
return (
|
||||
<div className='w-80 bg-white p-6'>
|
||||
<h2 className='mb-4 text-2xl text-orange font-bold'>{`Hook'em Horns!`}</h2>
|
||||
<p className='mb-6 text-gray-600'>Your feedback is music to our ears. Thanks for helping us improve!</p>
|
||||
<button
|
||||
className='w-full rounded bg-orange-600 px-4 py-2 text-white font-bold transition duration-300 hover:bg-orange-700'
|
||||
onClick={() => window.close()}
|
||||
>
|
||||
Close
|
||||
</button>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className='w-80 bg-white p-6'>
|
||||
<h2 className='mb-4 text-2xl text-ut-burntorange font-bold'>Longhorn Feedback</h2>
|
||||
<div className='w-92 bg-white p-6'>
|
||||
<h2 className='my-4 text-2xl text-ut-burntorange font-bold'>Longhorn Feedback</h2>
|
||||
<p className='mb-4 text-sm text-ut-black'>Help us make UT Registration Plus even better!</p>
|
||||
|
||||
<form onSubmit={submitFeedback}>
|
||||
<div className='mb-4'>
|
||||
<div className='mb-1'>
|
||||
<label htmlFor='email' className='mb-1 block text-sm text-ut-black font-medium'>
|
||||
Your @utexas.edu email
|
||||
</label>
|
||||
@@ -85,8 +108,13 @@ export default function ReportIssueMain(): JSX.Element {
|
||||
<input
|
||||
type='email'
|
||||
id='email'
|
||||
value={email}
|
||||
onChange={e => setEmail(e.target.value)}
|
||||
value={emailAddress}
|
||||
onChange={e =>
|
||||
setEmailAddress({
|
||||
emailAddress: e.target.value,
|
||||
rememberMyEmail: rememberMyEmail ?? false,
|
||||
})
|
||||
}
|
||||
className='w-full border border-gray-300 rounded-md px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-orange-500'
|
||||
placeholder='bevo@utexas.edu'
|
||||
required
|
||||
@@ -94,6 +122,23 @@ export default function ReportIssueMain(): JSX.Element {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className='mb-4'>
|
||||
<label className='mb-1 flex cursor-pointer content-center gap-1.25 text-sm text-ut-black font-medium'>
|
||||
<input
|
||||
type='checkbox'
|
||||
className='cursor-pointer'
|
||||
checked={rememberMyEmail}
|
||||
onChange={e =>
|
||||
setRememberMyEmail({
|
||||
rememberMyEmail: e.target.checked,
|
||||
emailAddress: emailAddress ?? '',
|
||||
})
|
||||
}
|
||||
/>{' '}
|
||||
Remember my email
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div className='mb-4'>
|
||||
<label htmlFor='feedback' className='mb-1 block text-sm text-ut-black font-medium'>
|
||||
Your feedback
|
||||
|
||||
@@ -22,10 +22,6 @@ const links: LinkItem[] = [
|
||||
text: "Fall '25 Course Schedule",
|
||||
url: 'https://utdirect.utexas.edu/apps/registrar/course_schedule/20259/',
|
||||
},
|
||||
{
|
||||
text: "Summer '25 Course Schedule",
|
||||
url: 'https://utdirect.utexas.edu/apps/registrar/course_schedule/20256/',
|
||||
},
|
||||
{
|
||||
text: 'Course Schedule Archives',
|
||||
url: 'https://registrar.utexas.edu/schedules/archive',
|
||||
|
||||
Reference in New Issue
Block a user