Skip to content

Instantly share code, notes, and snippets.

View jamesporter's full-sized avatar

James Porter jamesporter

View GitHub Profile
@jamesporter
jamesporter / quick-tap.swift
Created March 20, 2022 19:23
SwiftUI (Quick) Tap Gesture
import SwiftUI
// fuck it this should be fine-ish (as on main thread)?
fileprivate var lastStartPoint: CGPoint?
extension View {
func quickTap(action: @escaping () -> Void) -> some View {
gesture(DragGesture(minimumDistance: 0).onChanged { value in
if value.startLocation == lastStartPoint {
@jamesporter
jamesporter / promisify-streams-axios-file-get-example.ts
Created November 17, 2021 11:09
Promisify Streams (quick/hacky version)
function dl(url: string, title: string, idx: number): Promise<boolean> {
const file = fs.createWriteStream(`./downloads/${pad(idx)}-${title}.mp4`)
return new Promise((resolve, reject) => {
axios({
method: "get",
url,
responseType: "stream",
}).then((response) => {
response.data.pipe(file)
response.data.on("end", () => {
@jamesporter
jamesporter / SwiftUI-searchable-bug.swift
Created November 10, 2021 17:42
SwiftUI searchable modifier bug
import SwiftUI
struct ContentView: View {
@State var query = ""
var body: some View {
NavigationView {
ScrollView {
LazyVStack {
ForEach(0..<100, id: \.self) { n in
HStack {
@jamesporter
jamesporter / ZoomableView.swift
Created October 23, 2021 10:50
Simple pinch to zoom View extension, allowing for limits to zoom scale
import SwiftUI
enum Config {
static let zoomRange: ClosedRange<CGFloat> = 0.05...1.0
}
extension View {
func zoomable(scale: Binding<CGFloat>) -> some View {
ZoomableView(scale: scale) {
self
@jamesporter
jamesporter / package.json
Created August 25, 2021 20:47
React Native package.json different iOS devices snippet
{
"ios": "react-native run-ios",
"ios:iPad": "react-native run-ios --simulator=\"iPad Pro (11-inch) (3rd generation)\"",
"ios:iPhone8": "react-native run-ios --simulator=\"iPhone 8 Plus\"",
"ios:iPhone11": "react-native run-ios --simulator=\"iPhone 11 Pro Max\""
}
@jamesporter
jamesporter / Info.plist
Created August 25, 2021 20:30
Info.plist with sensible defaults: portrait only on iPhone, all on iPad
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
@jamesporter
jamesporter / TemplateAreasPoC.swift
Created January 24, 2021 21:09
SwiftUI Template Areas PoC
import SwiftUI
fileprivate struct SizeSpecKey: EnvironmentKey {
static let defaultValue = SizeSpec(size: CGSize.zero)
}
extension EnvironmentValues {
var sizeSpec: SizeSpec {
get { self[SizeSpecKey.self] }
@jamesporter
jamesporter / index.tsx
Last active July 18, 2020 09:17
PoC react-xr (react-three-fiber) demo
import Head from "next/head";
import { VRCanvas, DefaultXRControllers, useXR, Hover, Select } from "react-xr";
import { useFrame } from "react-three-fiber";
import { useState, useRef } from "react";
function Box({
size = 1,
position = [0, 0, 0],
}: {
size?: number;
@jamesporter
jamesporter / ContentView.swift
Created January 13, 2020 08:38
POC Navigator, driven by ObservableObject
import SwiftUI
class NavState: ObservableObject {
@Published var modalActive = false
@Published var navDepth = 0
}
struct ContentView: View {
@EnvironmentObject var navState: NavState
@jamesporter
jamesporter / openjscad-cheat-sheet.md
Created July 16, 2018 22:09
Openjscad Cheat Sheet

OpenJSCAD Cheat Sheet

James Porter

0. 3D

  • Architecture-style
  • x,y,z

1. main