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) => (