From 71d570e14ebb02b9287c534a054a835a3eeaa4df Mon Sep 17 00:00:00 2001 From: Viren070 Date: Thu, 9 Jan 2025 14:57:16 +0000 Subject: [PATCH] feat(frontend): make services sortable --- packages/frontend/src/app/configure/page.tsx | 23 +++- .../src/components/ServiceInput.module.css | 26 +++++ .../frontend/src/components/ServiceInput.tsx | 110 +++++++++++++++--- packages/types/src/types.ts | 14 +++ 4 files changed, 154 insertions(+), 19 deletions(-) diff --git a/packages/frontend/src/app/configure/page.tsx b/packages/frontend/src/app/configure/page.tsx index ad97cc0e..51513aaf 100644 --- a/packages/frontend/src/app/configure/page.tsx +++ b/packages/frontend/src/app/configure/page.tsx @@ -11,6 +11,8 @@ import { VisualTag, AudioTag, Encode, + ServiceDetail, + ServiceCredential, } from '@aiostreams/types'; import SortableCardList from '../../components/SortableCardList'; import ServiceInput from '../../components/ServiceInput'; @@ -686,7 +688,7 @@ export default function Configure() { Enable the services you have accounts with and enter your credentials.

- {services.map((service) => ( + {services.map((service, index) => ( detail.id === service.id) - ?.credentials.map((credential) => ({ + .find((detail: ServiceDetail) => detail.id === service.id) + ?.credentials.map((credential: ServiceCredential) => ({ label: credential.label, link: credential.link, value: service.credentials[credential.id] || '', @@ -722,6 +724,21 @@ export default function Configure() { }, })) || [] } + moveService={(direction) => { + const newServices = [...services]; + const serviceIndex = newServices.findIndex( + (s) => s.id === service.id + ); + const [movedService] = newServices.splice(serviceIndex, 1); + if (direction === 'up' && serviceIndex > 0) { + newServices.splice(serviceIndex - 1, 0, movedService); + } else if (direction === 'down' && serviceIndex < newServices.length) { + newServices.splice(serviceIndex + 1, 0, movedService); + } + setServices(newServices); + }} + canMoveUp={index > 0} + canMoveDown={index < services.length - 1} /> ))} diff --git a/packages/frontend/src/components/ServiceInput.module.css b/packages/frontend/src/components/ServiceInput.module.css index 1ba42fca..6ede9f7a 100644 --- a/packages/frontend/src/components/ServiceInput.module.css +++ b/packages/frontend/src/components/ServiceInput.module.css @@ -51,3 +51,29 @@ flex-direction: column; gap: 5px; } + +.actions { + display: flex; + align-items: center; +} + +.actionButton { + background-color: transparent; + border-radius: var(--borderRadius); + display: flex; + margin: 5px; + font-size: 1.2em; + align-items: center; + border-width: 0; + transition: transform 0.2s; + -webkit-tap-highlight-color: transparent; +} + +.actionButton:hover { + transform: scale(1.1); + cursor: pointer; +} + +.actionButton:active { + transform: scale(0.9); +} \ No newline at end of file diff --git a/packages/frontend/src/components/ServiceInput.tsx b/packages/frontend/src/components/ServiceInput.tsx index 42ac3a93..45bedf61 100644 --- a/packages/frontend/src/components/ServiceInput.tsx +++ b/packages/frontend/src/components/ServiceInput.tsx @@ -3,7 +3,7 @@ import styles from './ServiceInput.module.css'; interface Field { label: string; - link: string; + link?: string; value: string; setValue: (value: string) => void; } @@ -13,6 +13,9 @@ interface ServiceInputProps { enabled: boolean; setEnabled: (enabled: boolean) => void; fields: Field[]; + moveService: (direction: 'up' | 'down') => void; + canMoveUp: boolean; + canMoveDown: boolean; } const ServiceInput: React.FC = ({ @@ -20,6 +23,9 @@ const ServiceInput: React.FC = ({ enabled, setEnabled, fields, + moveService, + canMoveUp, + canMoveDown, }) => { return (
= ({ >
{serviceName} - setEnabled(e.target.checked)} - className={styles.checkbox} - /> +
+ {canMoveUp && ( + + )} + {canMoveDown && ( + + )} + setEnabled(e.target.checked)} + className={styles.checkbox} + /> +
{enabled && ( @@ -40,15 +113,20 @@ const ServiceInput: React.FC = ({ {fields.map((field, index) => (