Skip to content

Instantly share code, notes, and snippets.

View kmelve's full-sized avatar
💬
is typing

Knut Melvær kmelve

💬
is typing
View GitHub Profile
@kmelve
kmelve / page.tsx
Created May 17, 2024 17:39
Minimal totally-not-ready-for-prod Todo list example using Sanity Live Content API and Next.js Server Actions
import { redirect } from "next/navigation"
import { createClient } from "next-sanity"
const client = createClient({
apiVersion: "vX",
dataset: process.env.NEXT_PUBLIC_SANITY_DATASET,
projectId: process.env.NEXT_PUBLIC_SANITY_PROJECT_ID,
token: process.env.SANITY_WRITE_TOKEN,
useCdn: true,
})
@kmelve
kmelve / post.groq
Created June 23, 2023 06:22
How to join referenced category documents for a post with GROQ
// Try it out here: https://groq.dev/iZPFWScPZXANqgFGQgoUH2
*[_type == "post"]{
...,
// join into an array of just the titles
"categoryTitles": categories[]->title,
// join the completedocuments
"categoryDocs": categories[]->,
// join and project specific fields
categories[]->{
import {defineConfig, type Role} from 'sanity'
import {deskTool} from 'sanity/desk'
import {visionTool} from '@sanity/vision'
import {schemaTypes} from './schemas'
export const EDITOR_TYPES = ['post']
const isAdmin = (roles: Role[]) => !roles?.find(({name = ''}) => name === 'administrator')
export default defineConfig({
@kmelve
kmelve / handlePaste.js
Last active October 7, 2022 21:38
Markdown Paste Handling for Sanity Studio v2 using micromark
/* Remember:
sanity install @sanity/code-input
yarn add micromark 
*/
import { micromark } from 'micromark'
import { htmlToBlocks } from '@sanity/block-tools'
export async function handlePaste(input) {
const { event, type, path } = input
const text = event.clipboardData.getData('text/plain')
@kmelve
kmelve / import_json_from_sanity_appsscript.js
Last active September 22, 2022 07:31 — forked from paulgambill/import_json_appsscript.js
Adjusted script for working with the Sanity API
/**
* Retrieves all the rows in the active spreadsheet that contain data and logs the
* values for each row.
* For more information on using the Spreadsheet API, see
* https://developers.google.com/apps-script/service_spreadsheet
*/
function readRows() {
var sheet = SpreadsheetApp.getActiveSheet();
var rows = sheet.getDataRange();
var numRows = rows.getNumRows();
#!/bin/bash
# Assumes that you have the Netlify and jq CLI tools installed and that you are logged in.
# Only been tested on macOS and zsh
# Will change the build image for all sites in a Netlify account to the specified image
#
# Usage: sh ./netlify-build-image-bulk.sh
# This assumes that you have logged in with the CLI fairly recently and that you're on macOS
# For other systems: https://github.com/sindresorhus/env-paths#pathsconfig
NETLIFY_AUTH=$(cat ~/Library/Preferences/netlify/config.json|jq -r ".users[].auth.token")
@kmelve
kmelve / posts.blade.php
Created August 10, 2022 11:51
Minimal implementation of Sanity.io content in Laraval using the offical example app as a starting point. https://laravel.com/docs/9.x/installation#your-first-laravel-project
<!-- resources/views/posts.blade.php -->
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Laravel</title>
<!-- Fonts -->
@kmelve
kmelve / TheProject.html
Created April 6, 2022 07:05
The HTML for The World Wide Web project (http://info.cern.ch/hypertext/WWW/TheProject.html)
<HEADER>
<TITLE>The World Wide Web project</TITLE>
<NEXTID N="55">
</HEADER>
<BODY>
<H1>World Wide Web</H1>The WorldWideWeb (W3) is a wide-area<A
NAME=0 HREF="WhatIs.html">
hypermedia</A> information retrieval
initiative aiming to give universal
@kmelve
kmelve / route.js
Created February 11, 2022 17:48
Simple A/B testing abstraction used on Sanity.io
export default {
name: 'route',
type: 'document',
title: 'Route',
fields: [
{
name: 'title',
type: 'string',
description: 'This title populates meta-tags on the webpage'
},
@kmelve
kmelve / _middleware.js
Created November 12, 2021 04:27
Proof of concepts simple page views with Next.js middleware
// posts/_middleware.js
import { NextResponse } from 'next/server'
const config = {
dataset: process.env.NEXT_PUBLIC_SANITY_DATASET || 'production',
projectId: process.env.NEXT_PUBLIC_SANITY_PROJECT_ID,
apiVersion: '2021-10-21',
}
const baseUrl = cdn => `https://${config.projectId}.api${cdn ? 'cdn' : ''}.sanity.io/v${config.apiVersion}`
const queryUrl = baseUrl() + `/data/query/${config.dataset}/`