One Paragraph of project description goes here
These instructions will get you a copy of the project up and running on your local machine for development and testing purposes. See deployment for notes on how to deploy the project on a live system.
/* eslint-disable consistent-return */ | |
/* eslint-disable effector/mandatory-scope-binding */ | |
/* eslint-disable effector/no-watch */ | |
import type { Node } from 'effector'; | |
import { | |
clearNode, | |
attach, | |
// combine, | |
createEffect, | |
createNode, |
export function WorkspacePaneTable( | |
props: WorkspacePaneProps<Workspace.WorkspaceItemHeaderTable> | |
) { | |
let [selectedId, setSelectedId] = React.useState<Data.Id | null>(null); | |
let catalog = Recoil.useRecoilValue(Data.$catalog); | |
let table = catalog.schema_tables[props.item.name]; | |
let query = React.useMemo(() => createQuery(table), [table]); | |
let panes = State.usePanesAPI(); |
This config assumes that nginx is run from docker image _/nginx.
docker network create nginx
mkdir -p /etc/myproject/nginx
cd /etc/myproject/nginx
# | |
# Name: nginx-tls.conf | |
# Auth: Gavin Lloyd <[email protected]> | |
# Desc: Nginx SSL/TLS configuration for "A+" Qualys SSL Labs rating | |
# | |
# Enables HTTP/2, PFS, HSTS and OCSP stapling. Configuration options not related | |
# to SSL/TLS are omitted here. | |
# | |
# Example: https://www.ssllabs.com/ssltest/analyze.html?d=gavinhungry.io | |
# |
CREATE OR REPLACE FUNCTION table_update_notify() RETURNS trigger AS $$ | |
DECLARE | |
id UUID; | |
BEGIN | |
IF TG_OP = 'INSERT' OR TG_OP = 'UPDATE' THEN | |
id = NEW.id; | |
ELSE | |
id = OLD.id; | |
END IF; | |
PERFORM pg_notify('table_update', json_build_object('table', TG_TABLE_NAME, 'type', TG_OP, 'record', NEW, 'prev', OLD)::text); |
import { createEffect, createEvent, createStore, merge } from "effector" | |
import nanoid from "nanoid" | |
import { parseObject, request } from "jsonrpc-lite" | |
const wsURL = `ws://localhost:${process.env.WS_PORT}` | |
const awaitingMap = new Map() | |
let socket | |
const open = createEvent() |
.button { | |
border: 1px solid #555; | |
text-align: center; | |
padding: 0 12px; | |
color: #ddd; | |
cursor: pointer; | |
} | |
.button:hover { | |
background: rgba(255, 255, 255, .25) |
import React, { useLayoutEffect, useRef } from 'react' | |
import { useStore } from 'effector-react' | |
import * as effector from 'effector' | |
import { pathOr } from 'ramda' | |
const trackCreateStore = effector.createEvent('trackCreateStore') | |
const trackCreateEvent = effector.createEvent('trackCreateEvent') | |
const trackCreateEffect = effector.createEvent('trackCreateEffect') | |
const trackCreateStoreObject = effector.createEvent('trackCreateStoreObject') |
import { fetchStatus } from "@lib/fetch"; | |
import { userApi } from "@feature/users/api"; | |
import { actions } from "./symbiotes"; | |
import * as selectors from "./selectors"; | |
/* | |
userApi.fetchUser() should throw an Error, if server returned object with error | |
*/ | |
/* |