diff --git a/website/src/repl/panel/PatternsTab.jsx b/website/src/repl/panel/PatternsTab.jsx
index 2c4d8038..4a4a3930 100644
--- a/website/src/repl/panel/PatternsTab.jsx
+++ b/website/src/repl/panel/PatternsTab.jsx
@@ -1,10 +1,29 @@
-import { cx } from '@strudel.cycles/react';
import React from 'react';
import * as tunes from '../tunes.mjs';
+import { useSettings, clearUserPatterns, newUserPattern } from '../../settings.mjs';
export function PatternsTab({ context }) {
+ const { userPatterns } = useSettings();
return (
-
+
+
My Patterns
+
+
+
+
+ {Object.entries(userPatterns).map(([key, up]) => (
+
{
+ const { code } = up;
+ console.log('clikkk', code);
+ context.handleUpdate(code);
+ }}
+ >
+ {key}
+
+ ))}
Examples
{Object.entries(tunes).map(([key, tune]) => (
);
}
+
+/*
+selectable examples
+if example selected
+ type character -> create new user pattern with exampleName_n
+ even if
+clicking (+) opens the "new" example with same behavior as above
+*/
diff --git a/website/src/settings.mjs b/website/src/settings.mjs
index 036c5509..2bb0ac14 100644
--- a/website/src/settings.mjs
+++ b/website/src/settings.mjs
@@ -15,6 +15,7 @@ export const defaultSettings = {
isZen: false,
soundsFilter: 'all',
panelPosition: 'bottom',
+ userPatterns: '{}',
};
export const settingsMap = persistentMap('strudel-settings', defaultSettings);
@@ -29,6 +30,7 @@ export function useSettings() {
isLineWrappingEnabled: [true, 'true'].includes(state.isLineWrappingEnabled) ? true : false,
fontSize: Number(state.fontSize),
panelPosition: state.activeFooter !== '' ? state.panelPosition : 'bottom',
+ userPatterns: JSON.parse(state.userPatterns),
};
}
@@ -51,3 +53,34 @@ export const fontFamily = patternSetting('fontFamily');
export const fontSize = patternSetting('fontSize');
export const settingPatterns = { theme, fontFamily, fontSize };
+
+function getUserPatterns() {
+ return JSON.parse(settingsMap.get().userPatterns);
+}
+function setUserPatterns(obj) {
+ settingsMap.setKey('userPatterns', JSON.stringify(obj));
+}
+
+export function addUserPattern(name, config) {
+ if (typeof config !== 'object') {
+ throw new Error('addUserPattern expected object as second param');
+ }
+ if (!config.code) {
+ throw new Error('addUserPattern expected code as property of second param');
+ }
+ const userPatterns = getUserPatterns();
+ setUserPatterns({ ...userPatterns, [name]: config });
+}
+
+export function newUserPattern() {
+ const userPatterns = getUserPatterns();
+ const date = new Date().toISOString().split('T')[0];
+ const todays = Object.entries(userPatterns).filter(([name]) => name.startsWith(date));
+ const num = String(todays.length + 1).padStart(3, '0');
+ const defaultNewPattern = 's("hh")';
+ addUserPattern(date + '_' + num, { code: defaultNewPattern });
+}
+
+export function clearUserPatterns() {
+ setUserPatterns({});
+}